面试题 04.12. 求和路径

 方法一:暴力搜索

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;
    }

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