- 这道题的本质和我们此前做的10、和为 k 的子数组一样,所以可以用前缀和来解决
- 但是前缀和不能等到全都遍历完了,在叶结点计算,因为这样会产生重复计算的问题,所以需要边遍历边计算
- 每次dfs函数需要把上一个元素的前缀和传入,这样方便我们计算本次的前缀和
- 注意map是shallow-copy 所以子函数会对map产生影响,这样可能会影响父函数对于个数的判断,因此我们在dfs函数结束前要加一句
sums.put(sum, sums.get(sum) - 1);
这样会把该结点的前缀和从map中移除,所以就不会对父函数查表产生影响
class Solution {
public int pathSum(TreeNode root, int targetSum) {
int[] time = new int[]{0};
Map<Integer, Integer> sums = new HashMap<>();
sums.put(0, 1);
dfs(root, 0, sums, time, targetSum);
return time[0];
}
private void dfs(TreeNode root, int sum, Map<Integer, Integer> sums, int[] time, int target) {
if (null == root)
return;
sum += root.val;
time[0] += sums.getOrDefault(sum - target, 0);
sums.put(sum, sums.getOrDefault(sum, 0) + 1);
dfs(root.left, sum, sums, time, target);
dfs(root.right, sum, sums, time, target);
sums.put(sum, sums.get(sum) - 1);
}
}