!!!!双层递归,自顶向下!!!!!
要点:
(1)既然要求不从根节点开始,也不需要在叶子结点结束,那么我们可以用一个双层的递归,内层的递归对每一个分枝进行自顶向下的完整遍历求和,外层递归则从顶部结点开始,一个一个的往下移动。这样做到了从任意结点开始的求和计算。
(2)内层的递归每一次targetSum要减去当前结点的数值,如果判断当前值已经等于targetSum了,则存在一条路径。
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:TreeNode, targetSum):
def pathCount(root:TreeNode, targetSum):
if not root:
return 0
res = 0
if root.val == targetSum:
res = res + 1
res = res + pathCount(root.left, targetSum - root.val)
res = res + pathCount(root.right, targetSum - root.val)
return res
if not root:
return 0
res = pathCount(root, targetSum)
res = res + self.hasPathSum(root.left, targetSum)
res = res + self.hasPathSum(root.right, targetSum)
return res
node = TreeNode(10)
node.left = TreeNode(5)
node.left.left = TreeNode(3)
node.right = TreeNode(-3)
node.right.right = TreeNode(11)
targetSum = 8
a = Solution()
b = a.hasPathSum(node, targetSum)
print(f'路径一共有{b}条')