Leetcode 437. Path Sum III
题目链接: Path Sum III
难度:Medium
题目大意:
找出二叉树中所有从上往下路径和为target的路径,路径中可以只含有一个节点。
思路:
参考高赞回答,用到了递归与回溯。回溯比较难理解,看了好久才弄懂
代码
/**
* 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 {
public int pathSum(TreeNode root, int target) {
Map<Integer,Integer> prefixSumCount=new HashMap<>();
//key为从root到当前节点的前缀和,value为个数,即有多少个节点的前缀和为key
prefixSumCount.put(0,1);//
return help(root,prefixSumCount,0,target);
}
public int help(TreeNode root,Map<Integer,Integer> prefixSumCount,int curSum,int target){
if(root==null){
return 0;
}
curSum+=root.val;
int res=prefixSumCount.getOrDefault(curSum-target,0);
//中间存在某个节点的到根节点的累加和为curSum-target,则中间节点到当前节点
//之间的路径和为target。curSum=(curSum-target)+target
prefixSumCount.put(curSum,prefixSumCount.getOrDefault(curSum,0)+1);
res+=help(root.left,prefixSumCount,curSum,target);
res+=help(root.right,prefixSumCount,curSum,target);
//curSum的值是不断传下去的,表示根节点到当前节点的累加和
prefixSumCount.put(curSum,prefixSumCount.get(curSum)-1);
//回溯,回到本层,map传递的是地址,指向同一内存,需要将值回复到原来的状态,防止影响
//后续的递归遍历。curSum是值传递,下一层怎么变和当前层没有关系,不需要手动恢复状态。
return res;
}
}