哈希表+DFS快速解决力扣129题:求根节点到叶节点数字之和

简介: 哈希表+DFS快速解决力扣129题:求根节点到叶节点数字之和

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

题目描述

给定一个二叉树,计算所有根节点到叶节点数字之和。

说明:

  • 叶子节点是指没有子节点的节点。
  • 每条从根节点到叶节点的路径代表一个数字。

示例:

输入: [1,2,3]
    1
   / \
  2   3
输出: 25
解释: 从根节点到叶节点的路径 1->2 表示数字 12.
     从根节点到叶节点的路径 1->3 表示数字 13.
     因此,数字之和为 12 + 13 = 25.

方法:深度优先搜索

解题步骤

  1. 定义一个辅助函数 dfs,用于递归遍历每个节点。
  2. 在递归过程中,计算从根节点到当前节点的数字。
  3. 如果当前节点是叶子节点,则将当前数字加到总和中。
  4. 对于每个非叶子节点,递归调用其子节点,并将当前节点的值传递下去。
  5. 最终返回总和。

Python 示例

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def sumNumbers(root):
    def dfs(node, current_sum):
        if not node:
            return 0
        current_sum = current_sum * 10 + node.val
        if not node.left and not node.right:
            return current_sum
        return dfs(node.left, current_sum) + dfs(node.right, current_sum)
    
    return dfs(root, 0)
# 示例使用
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
print(sumNumbers(root))  # 输出: 25

算法分析

  • 时间复杂度:O(n),其中 n 是二叉树中的节点数量,因为每个节点访问一次。
  • 空间复杂度:O(h),其中 h 是二叉树的高度,用于递归调用栈的空间。

详细步骤说明

  1. 定义辅助函数 dfs
  • dfs(node, current_sum) 用于计算从根节点到当前节点的数字。
  • 如果当前节点为 None,返回 0
  1. 计算当前路径数字
  • current_sum = current_sum * 10 + node.val,将当前节点值加到路径数字中。
  1. 判断叶子节点
  • 如果当前节点是叶子节点,返回当前路径数字。
  • 否则,对其左右子节点递归调用 dfs 并累加结果。
  1. 返回总和
  • 最后在主函数中调用 dfs 并返回总和。

更多示例

  1. 输入:[4,9,0,5,1]
4
   / \
  9   0
 / \
5   1
  • 输出:1026
  • 解释:路径 4->9->5 表示数字 495,路径 4->9->1 表示数字 491,路径 4->0 表示数字 40。总和为 495 + 491 + 40 = 1026
  1. 输入:[1,0]
1
 /
0
  • 输出:10
  • 解释:路径 1->0 表示数字 10

图示与说明

考虑输入 [4,9,0,5,1]

  1. 构建二叉树
4
   / \
  9   0
 / \
5   1
  1. 递归遍历树
步骤 当前节点 当前路径数字 说明
初始 4 4 根节点
左子树 9 49
左子树 5 495 叶子节点
返回 495 加入总和
右子树 1 491 叶子节点
返回 491 加入总和
右子树 0 40 叶子节点
返回 40 加入总和
  1. 总和计算
  • 495 + 491 + 40 = 1026

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)

欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
17 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
40 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
5月前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
36 0
|
1月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
15 0
|
3月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
3月前
|
Python
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
38 4
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
52 5
|
3月前
|
Python
【Leetcode刷题Python】222. 完全二叉树的节点个数
LeetCode第222题"完全二叉树的节点个数"的Python代码实现,通过递归和深度优先遍历的方法来计算给定完全二叉树的节点总数。
38 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
41 4
|
5月前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
32 1