给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
func pathSum(root *TreeNode, targetSum int) int {
if root == nil {
return 0
}
//使用哈希表记录节点和出现的次数
sumCount := make(map[int]int)
sumCount[0] = 1
var dfs func(node *TreeNode, sum int) int
dfs = func(node *TreeNode, sum int) int {
if node == nil {
return 0
}
//更新当前节点的前缀和
sum += node.Val
//如果出现过sum-targetSum,name一定有路径满足要求
count := sumCount[sum-targetSum]
sumCount[sum]++
//在其父节点前缀和的基础上进行求和,判断是否存在满足sum-targetSum的节点
count += dfs(node.Left, sum)
count += dfs(node.Right, sum)
//回溯,每当我们从左子节点或右子节点递归返回到当前节点时,我们需要将当前节点的节点值从 sumCount 中减去,以保证在当前节点的父节点的递归中,sumCount 中记录的是从根节点到当前节点的路径的节点值之和。
//如果不进行回溯,而是在递归过程中不断累加节点值到 sumCount 中,会导致 sumCount 中记录的节点值之和不准确,进而影响到最终的结果。
sumCount[sum]--
return count
}
return dfs(root, 0)
}