心路历程:
这道题递推并不难,但是有细节需要注意,主要就是区间可以不是根节点,以及结束不一定是叶子结点这两个限制。
其余的动态规划即可。
注意的点:
1、由于终点不一定是叶子结点,所以当递归的target等于0时,需要加1。
2、当node为空时,应该直接返回0,因为已经在上一步的递归中对恰好满足的进行了+1计算,满足循环不变量的原则。
3、由于起点不一定是根节点,所以需要对整个树进行dfs遍历。
解法:动态规划
# 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 pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:
# 以node为根节点的满足路径和的数量
@cache
def dp(node, targetSum_n):
if not node:
return 0 # 循环不变量,在后面return + 1中已经考虑到了这一点
leftvalue = targetSum_n - node.val
if leftvalue == 0:
return 1 + dp(node.left, 0) + dp(node.right, 0)
else:
return dp(node.left, leftvalue) + dp(node.right, leftvalue)
res = 0
def dfs(node):
nonlocal res
if not node:
return
res += dp(node, targetSum)
dfs(node.left)
dfs(node.right)
dfs(root)
return res