Leetcode 437. Path Sum III(递归与回溯)

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值