
java
/**
* 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 {
int count = 0;
Map<Long,Integer> prefixMap = new HashMap<>();
public int pathSum(TreeNode root, int targetSum) {
prefixMap.put(0L,1);
drive(root, 0L, targetSum);
return count;
}
private void drive(TreeNode node, long currSum, int targetSum){
if(node == null){
return;
}
//1.往下遍历,将当前节点加入到map集合中
currSum += node.val;
//2.找之前节点中是否有我们需要的值
long oldSum = currSum - targetSum;
if(prefixMap.containsKey(oldSum)){
count += prefixMap.get(oldSum);
}
//3.将新的值存进map中
prefixMap.put(currSum,prefixMap.getOrDefault(currSum,0) + 1);
drive(node.left,currSum,targetSum);
drive(node.right,currSum,targetSum);
//4。回溯
prefixMap.put(currSum,prefixMap.get(currSum) - 1);
}
}
prefixMap.put(currSum, prefixMap.getOrDefault(currSum, 0) + 1);
查找currSum出现过几次,查到了就把次数拿出来;没查到,就当作0次。然后在现有基础上+1,然后重新写入map集合中。
不能使用int count = prefixMap.get(18);因为如果为null执行+1操作会报空指针异常。