版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/82183620
给定一个二叉树,它的每个结点都存放一个 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.
解题思路
这个问题几乎和Leetcode 257:二叉树的所有路径(最详细的解法!!!)一模一样,我们直接套用之前方法就可以了。我这里的写法参考了Leetcode 113:二叉树的所有路径(最详细的解法!!!)中最后的回溯
写法,如果采用Leetcode 257
,会碰到一些问题。
class Solution:
def _sumNumbers(self, root, value):
if root:
if not root.left and not root.right:
self.result += value*10 + root.val
self._sumNumbers(root.left, value*10+root.val)
self._sumNumbers(root.right, value*10+root.val)
def sumNumbers(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.result = 0
self._sumNumbers(root, 0)
return self.result
我们知道python语法中,对于不可变参数是通过值传递
的,这样的话,我们传递result
参数就不能简单的通过形参
来传递了,而是要通过全局变量的方式。
同样我们我们希望可以通过递归的方法去解决这个问题。这里我们可以使用Leetcode 257
中的写法。
class Solution:
def sumNumbers(self, root):
"""
:type root: TreeNode
:rtype: int
"""
result = 0
if not root:
return result
path = [(0, root)]
while path:
pre, node = path.pop()
if node:
if not node.left and not node.right :
result += pre*10 + node.val
path += [(pre*10 + node.val, node.right), (pre*10 + node.val, node.left)]
return result
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!