题目链接:LeeCode437路径总和Ⅲ
题目描述:
原文地址
这个题是看题解大佬才学会的,本来想dfs硬搜,但是感觉不太能实现,之后看完正好用前缀和,hashmap存下来,
class Solution {
static Map<Integer,Integer> map;
static int target;
public static int pathSum(TreeNode root, int sum) {
map=new HashMap<>();
target=sum;
//第一次算出来的时候加一
map.put(0,1);
return dfs(root,0);
}
public static int dfs(TreeNode root,int sum){
//递归出口
if(root==null)return 0;
int ans=0;
//有对应匹配的算出数量加到结果中
ans+=map.getOrDefault(sum+ root.val-target,0);
//将当前前缀放入map中
map.put(sum+ root.val,map.getOrDefault(sum+ root.val,0)+1);
//左子树的结果数量
int left=dfs(root.left,sum+ root.val);
//右子树的结果数量
int right=dfs(root.right,sum+ root.val);
//总结果返回
ans+=left+right;
//因为当前节点已经算完了,所以当前节点的前缀和需要删除
map.put(sum+ root.val,map.getOrDefault(sum+ root.val,0)-1);
return ans;
}
}