LeetCode437路径总和 III(前缀和+哈希表+递归)

题目链接
在这里插入图片描述
刚做完一个前缀和的题目以为能切出来 最后还是看了题解 手动狗头 递归思想没想到
前缀和和哈希表就不用多说了,用哈希表存到达当前结点前路径上的所有前缀和值和数量
当匹配完这个结点时可以巧妙的都运用回溯再回到上一个结点并且删掉该结点更新的前缀和即可
因为思想是前缀和,所以不属于前缀的,我们就要去掉他

/**
 * 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 {
    private HashMap<Integer,Integer> presumMap ;
    private int k;
    private int res;
    public int pathSum(TreeNode root, int sum) {
        presumMap = new HashMap<>();
        presumMap.put(0,1);//第一个元素的前缀和为0
        this.k = sum;
        getRes(root,0);
        return res;
    }
    public void getRes(TreeNode node,int presum){
        if (node == null) return ;
        presum += node.val;//更新前缀和
        if (presumMap.containsKey(presum - k)){
            res += presumMap.get(presum - k);//看是否可以构成K值
        }
        presumMap.put(presum,presumMap.getOrDefault(presum,0)+1);//更新哈希表
        getRes(node.left,presum);//递归左节点
        getRes(node.right,presum);//递归右节点
        presumMap.put(presum,presumMap.get(presum)-1);//回溯 删除该结点的前缀和
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值