要求
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25
示例 2:
输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026
提示:
- 树中节点的数目在范围 [1, 1000] 内
- 0 <= Node.val <= 9
- 树的深度不超过 10
核心代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sumNumbers(self, root: TreeNode) -> int:
if not root:
return 0
result = []
if not root.left and not root.right:
return root.val
else:
self.findPath(root.left,[root.val],result)
self.findPath(root.right,[root.val],result)
return sum(result)
def findPath(self,node,temp_path,result):
if not node:
return
temp_path.append(node.val)
if not node.left and not node.right:
path_sum = 0
for value in temp_path:
path_sum *= 10
path_sum += value
result.append(path_sum)
else:
self.findPath(node.left,temp_path,result)
self.findPath(node.right,temp_path,result)
temp_path.pop()
return
第二种解法
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sumNumbers(self, root: TreeNode) -> int:
self.res = 0
def dfs(node,tmp):
if not node:
return
tmp = tmp * 10 + node.val
if not node.left and not node.right:
self.res += tmp
dfs(node.left,tmp)
dfs(node.right,tmp)
dfs(root,0)
return self.res
解题思路:第一种解法:我们使用列表记录路径,然后不断的将路径进行找到,当我们发现一个叶子节点的时候,我们直接将路径中的数字整理成数字,最终将每条线路的值加和得到最后的结果,注意findPath的写法,很有借鉴意义;第二种解法:实际上就是一个深度遍历,我们将沿途的左右子树的值进行加载,最终汇总到res中,得到最终的加和结果。