leetcode:437. 路径总和 III
题目描述
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例
输入: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出: 3
解释: 和等于 8 的路径有 3 条,如图所示。
解题思路
前缀和
先序遍历,从根节点出发 方向从上向下,将累加和sum存入map。那么节点node1到节点node2之间累加和就可以表示为sum2 - sum1。
回溯
在走完一条路径之后,减去最后一个节点的val 同时map去除这条路径,避免错误的累加和被判断为路径和 影响前缀和的处理。
下面,1和2是正确的路径,3是没有回溯导致的错误路径记录。
回溯的时机应该是处理完所有的子节点后进行回溯,递归回溯当前路径的最后一个节点,保证左子树的前缀和不会交叉到右子树处理。
完整代码:
class Solution {
int cnt;
Map<Long, Integer> map;
public int pathSum(TreeNode root, int targetSum) {
cnt = 0;
map = new HashMap<>();
map.put(0L, 1);
dfs(root, targetSum, 0);
return cnt;
}
void dfs(TreeNode node, int target, long sum) {
if (null == node) return;
sum += node.val;
cnt += map.getOrDefault(sum - target, 0);
map.put(sum, map.getOrDefault(sum, 0) + 1);
dfs(node.left, target, sum);
dfs(node.right, target, sum);
map.put(sum, map.get(sum) - 1);
sum -= node.val;
}
}