题目难度: 中等
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
给定一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
根节点->该节点
的沿途数字列表, 然后递归调用子节点, 传入子节点以及加上子节点数字的新列表, 直到到达叶子节点, 此时就可以将这些数字拼接起来, 并累加到最终结果里1->2->3->4
, 其对应的数字自然是 1234, 上面的做法是节点 1 对应数字列表[1]
, 节点 2 对应数字列表[1,2]
, 依此类推1
, 节点 2 对应数字12=1*10+2
, 节点 3 对应数字123=12*10+3
, 节点 4 对应数字1234=123*10+4
, 这样就无需在到达叶子节点后拼接数字了O(N)
: 每个节点只需要遍历一次O(H)
: H 是树的深度, 也是递归栈的空间消耗class Solution:
def sumNumbers(self, root: TreeNode) -> int:
if not root:
# 根是空节点, 和为0
return 0
res = 0
def dfs(node, num):
# 传入当前节点node和"根节点->当前节点"的数字num
nonlocal res
if not node.left and not node.right:
# 当前节点是叶子节点, 累加其数字到最终结果
res += num
return
if node.left:
# 递归调用左子节点, 并更新数字
dfs(node.left, 10 * num + node.left.val)
if node.right:
# 递归调用右子节点, 并更新数字
dfs(node.right, 10 * num + node.right.val)
dfs(root, root.val)
return res
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~