/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int count = 0;
public int pathSum(TreeNode root, int sum) {
//sum frency
Map<Integer,Integer> map = new HashMap<>();
//如果从root加到leaf正好= sum 就会命中
map.put(0,1);
findAllNodeSum(root,0,sum,map);
return count;
}
void findAllNodeSum(TreeNode root,int cursum,int target,Map<Integer,Integer> map){
if(root==null){
return ;
}
cursum = cursum +root.val;
if(map.containsKey(cursum-target)){
count += map.get(cursum-target);
}
//判断是否以前节点的加现在的节点是否有符合要求的
if(!map.containsKey(cursum)){
map.put(cursum,1);
}else{
map.put(cursum,map.get(cursum)+1);
}
//dfs
findAllNodeSum(root.left,cursum,target,map);
findAllNodeSum(root.right,cursum,target,map);
//把当前叶子节点的和清掉
map.put(cursum,map.get(cursum)-1);
}
}