一、题目
二、代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution
{
//回溯 前缀和
//到达当前元素路径上,所有元素之和,就是前缀和
//前缀和相同 两节点间路径和为0 因为是作差的关系
//可以解释了 结果数 = cursum - another_sum =target
//获取 cursum - target = another_sum
//公用哈希map 所以每一层向下走增加 结束后清除
public int pathSum(TreeNode root, int targetSum)
{
Map<Long,Integer> map = new HashMap<>();
map.put(0L,1);
return cal(root , map, targetSum, 0);
}
public int cal(TreeNode cur,Map<Long,Integer> map,int target, long cur_sum)
{
if(cur == null) return 0;
int temp_val = cur.val;
cur_sum = cur_sum + temp_val;
int res = 0 ;
//当前加
res = res + map.getOrDefault(cur_sum - target,0);
map.put(cur_sum,map.getOrDefault(cur_sum,0)+1);
//左右
res = res + cal(cur.left,map,target,cur_sum);
res = res + cal(cur.right,map,target,cur_sum);
//恢复
map.put(cur_sum,map.get(cur_sum)-1);
return res;
}
}