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);//回溯 删除该结点的前缀和
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43434328/article/details/114646972
今日推荐