该题解采用了前缀和的方法来高效地计算路径和。对于二叉树中的任意一条路径,可以通过维护一个从根节点到当前节点的路径和,以及一个哈希表来记录所有可能的前缀和及其出现的次数。对每个节点,计算当前的路径和,并查询哈希表中路径和减去目标值(sum)的结果出现的次数,这些次数即为以当前节点结束的、和为目标值的路径数量。在遍历每个节点后,更新哈希表以包含当前路径和的次数,并在返回前减少当前路径和的计数,以防影响其他路径的计算。
时间复杂度: O(n)
空间复杂度: O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def pathSum(self, root: TreeNode, sum: int) -> int:
self.ans=0 # 用于存储路径和等于目标值的路径数量
prefix=defaultdict(int) # 哈希表用于记录前缀和及其出现的次数
prefix[0]=1 # 初始化前缀和为0的情况,对应从根节点开始的路径
def path(root, total):
if not root: # 如果节点为空,则返回
return
total+=root.val # 更新当前路径和
self.ans+=prefix[total-sum] # 查找当前路径和减去目标值的结果在哈希表中的次数
prefix[total]+=1 # 更新哈希表,包含当前路径和的次数
path(root.left, total) # 遍历左子树
path(root.right, total) # 遍历右子树
prefix[total]-=1 # 回溯,减少当前路径和的计数
path(root, 0) # 从根节点开始遍历
return self.ans # 返回结果