AttributeError:'NoneType'对象没有属性'left'

时间:2018-10-15 06:05:55

标签: python-3.x binary-tree

给出一棵二叉树和一个和,确定该树是否具有从根到叶的路径,以使该路径上的所有值加起来等于给定的和。

注意:叶是没有子节点。

示例:

给出下面的二叉树并求和= 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

谁能告诉我我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

主要问题是,当节点的左或右子节点为None时,您的助手将无法正确处理这些情况。它将在子级和尝试访问None.leftNone.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