题目描述:给定一个二叉树,它的每个结点都存放一个 0-9
的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3
代表数字 123
。计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3] 1 / \ 2 3 输出: 25 解释: 从根到叶子节点路径 1->2代表数字 12.从根到叶子节点路径 1->3代表数字 13.因此,数字总和 = 12 + 13 = 25.示例 2:
输入: [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。DFS做法,和求二叉树路径之和是一个思路,只是逻辑略微不一样,遇到叶子结点就把path放到res里,最后遍历res,求和,注意回溯要pop,还有类型转换的问题。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def sumNumbers(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
path = []
res = []
self.helper(root, path, res)
fi = 0
for path in res:
num = int(''.join(path))
fi += num
return fi
def helper(self, root, path, res):
if not root:
return
path.append(str(root.val))
if not root.left and not root.right:
res.append(path[:])
self.helper(root.left, path, res)
self.helper(root.right, path, res)
path.pop()
# 参照做法2,可知上段代码可以优化一下,path可以改成一个数字,就是截至目前的累积的数字
class Solution(object):
def sumNumbers(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
res = []
self.helper(root, root.val, res)
return sum(res)
def helper(self, root, val, res):
if not root:
return
if not root.left and not root.right:
res.append(val)
return
if root.left:
self.helper(root.left, val*10+root.left.val, res)
if root.right:
self.helper(root.right, val*10+root.right.val, res)
解法2。用循环,思路和递归基本一致,不过是BFS,用stack存放要被遍历的节点,但stack维护的元素内容是节点和截至目前的数字构成的二元组,res记录叶子节点的数字,也就是遍历到该叶子结点得到的数,返回res内数的和。
class Solution(object):
def sumNumbers(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
stack = [(root, root.val)]
res = []
while stack:
node, val = stack.pop(0)
if not node.left and not node.right:
res.append(val)
else:
if node.left:
stack.append((node.left, val*10+node.left.val))
if node.right:
stack.append((node.right, val*10+node.right.val))
return sum(res)