给出一棵二叉树和一个和,确定该树是否具有从根到叶的路径,以使该路径上的所有值加起来等于给定的和。
注意:叶是没有子节点。
示例:
给出下面的二叉树并求和= 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回true,因为存在从根到叶的路径5-> 4-> 11-> 2,其总和为22。
class Solution(object):
def hasPathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: bool
"""
l = []
def helper(tree, total):
if not tree.left and not tree.right:
l.append(total)
else:
helper(tree.left, total + tree.val)
helper(tree.right, total + tree.val)
return l
if root:
helper(root, 0)
return sum in l
return False
谁能告诉我我的代码出了什么问题?
答案 0 :(得分:0)
主要问题是,当节点的左或右子节点为None
时,您的助手将无法正确处理这些情况。它将在子级和尝试访问None.left
或None.right
的崩溃中都递归。
除此之外,这里不需要列表;如果您到达一片叶子并且发现您的累计总数等于总和,则可以返回True
。这样比较有效,因为您避免在找到解决方案后遍历树的其余部分,并且避免在树搜索结束后遍历列表以找到目标。
值得一提的是,Leetcode提供了参数sum
,该参数将覆盖内置函数。我通常会重命名此类变量,并可以随意在此处进行命名。
def hasPathSum(self, root, target):
"""
:type root: TreeNode
:type sum: int
:rtype: bool
"""
def helper(tree, total=0):
if not tree.left and not tree.right:
return target == total + tree.val
if tree.left and helper(tree.left, total + tree.val):
return True
if tree.right and helper(tree.right, total + tree.val):
return True
return False
return helper(root) if root else False