首页 > 其他 > 详细

面试题 04.12. 求和路径

时间:2020-07-16 22:49:28      阅读:43      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 方法一:暴力搜索

class Solution {
    private int res = 0;
    public int pathSum(TreeNode root, int sum) {
        order(root,sum);
        return res;
    }

    public void order(TreeNode root,int sum) {
        if(root == null) return ;
        dfs(root,sum);
        order(root.left,sum);
        order(root.right,sum);
        
    }

    public void dfs(TreeNode root, int sum) {
        if(root == null) return;
        if(sum - root.val == 0) res++;
        dfs(root.left,sum - root.val);
        dfs(root.right,sum - root.val);
    }
}

方法二:记录每个节点的前缀和

class Solution {

    public int pathSum(TreeNode root, int sum) {
        
        Map<Integer,Integer> map = new HashMap<>();  // 存放每个节点的前缀和,即之前所有父节点的和
        map.put(0,1); // 到根节点的情况
        return helper(root, map, sum, 0);
    }

    public int helper(TreeNode root, Map<Integer,Integer> map, int sum, int curSum) {
        if(root == null) return 0;

        curSum += root.val;
        int count = map.getOrDefault(curSum-sum,0); // 如果节点a的前缀和为curSum-sum那么节点a到当前节点的和为sum

        map.put(curSum,map.getOrDefault(curSum,0)+1); // 本层前缀和会影响下一层的判断,进入下一层要加入map
        count += helper(root.left,map,sum,curSum);
        count += helper(root.right,map,sum,curSum);
        map.put(curSum,map.get(curSum)-1); // 本层节点前缀和和上一层的没有关系,返回上一层时要移除掉
        return count;
    }

}

 

面试题 04.12. 求和路径

原文:https://www.cnblogs.com/yonezu/p/13324770.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!