# 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 hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
self.traversal(root, targetSum)
return self.symbol
def __init__(self):
self.symbol = False
def traversal(self, node, count):
if self.symbol == True:
return
if not node:
return
count -= node.val
if not node.left and not node.right and count == 0:
self.symbol = True
self.traversal(node.left, count)
self.traversal(node.right, count)
# 以上是正确且简洁的版本
? ? ?
? ? ? ??
? ? #以下是错的。错因在于,由于没有返回值,所以值只能从上往下传递无法从下往上传递
? ? #当symbol为True时,因为处于最下层,因此无法向上传递。
? ? #比如在第三层i=3,然后处理左右子树,进入下一层递归,然后在下一层递归i会变成4,
? ? #但是i=4的这层递归结束之后,回到第三层时,i还是3。
? ? #但是在其他题里看到列表形式的变量是可以进行值传递的,当变量在下一层更新时,当前层也会同步进行更新。于是开始钻牛角尖:尝试将symbol改成列表类型,看看当symbol append(1)时,其他层是否会保留symbol的变更? ? ? ?
??
? ? ? ? symbol = [0]
? ? ? ? test = []
? ? ? ? self.traversal(root, targetSum, symbol, test)
? ? ? ? return test
? ? def traversal(self, node, count, symbol, test):
? ? ? ? if not node:
? ? ? ? ? ? return
? ? ? ? count -= node.val
? ? ? ? test.append(symbol)
? ? ? ? if not node.left and not node.right and count == 0:
? ? ? ? ? ? symbol.append(1)
? ? ? ? self.traversal(node.left, count, symbol, test)
? ? ? ? self.traversal(node.right, count, symbol, test)
但是结果非常抽象,运行后得到:
可见哪怕在第一层,就已经得到append的那个1了,明明此时根本还没运行到那一行
于是再测试,将 ? test.append(symbol) 改成 ? test.append(symbol[1])。如果真的如代码输出所示,symbol在第一层就已经是[0,1]了,那么把symbol的第二个元素提出来应该不会有问题,但是却报错:out of index
所以在第一层迭代的时候symbol不可能是[0,1]的值,不知为何能够直接输出[0,1],非常奇妙
所以何必钻牛角尖,有时候钻不明白的地方本不是自己的问题