路径总和|||-leetcode
题目描述
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:

输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。
示例 2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3
提示:
- 二叉树的节点个数的范围是
[0,1000] -109 <= Node.val <= 109-1000 <= targetSum <= 1000
解法一
思路:
利用前缀和和回溯。前缀和curr为:由根结点到当前结点的路径上所有节点的和。对于某个节点,如果curr-target出现在了某个节点前缀和当中,说明那个节点到当前节点存在符合条件路径。

如5的左子节点3,该节点上的前缀和为18,目标是8,18-8=10,而前缀和为10出现在根节点上,那么根节点之后的节点5->3存在符合条件的路径。
代码:
public int dfs(TreeNode root, Map<Long, Integer> prefix, long curr, int targetSum) {
if(root == null) return 0;
//表示当前符合条件的路径个数
int ret=0;
//当前的前缀和
curr+=root.val;
//以当前节点为尾节点符合条件的路径次数
ret=prefix.getOrDefault(curr-targetSum,0);
//更新当前的前缀和出现次数
prefix.put(curr,prefix.getOrDefault(curr,0) + 1);
//在左子树寻找答案
ret+=dfs(root.left,prefix,curr,targetSum);
//在右子树寻找答案
ret+=dfs(root.right,prefix,curr,targetSum);
//回溯时,当前节点不在考虑范围内,需要把当前节点所带来的影响删除
prefix.put(curr,prefix.get(curr)-1);
return ret;
}
public int pathSum(TreeNode root, int targetSum) {
//prefix 记录前缀和,键是前缀和,值是前缀和出现的次数
Map<Long, Integer> prefix = new HashMap<Long, Integer>();
//0的前缀和出现1次,这样当某条路径从根开始累加刚好等于 targetSum 时:
// curr - targetSum = 0 就能被统计到。
prefix.put(0L, 1);
return dfs(root, prefix, 0, targetSum);
}

浙公网安备 33010602011771号