437. 路径总和 III(简单题)

题目描述:
给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

  10
 /  \
5   -3

/ \
3 2 11
/ \
3 -2 1

返回 3。和等于 8 的路径有:

  1. 5 -> 3
  2. 5 -> 2 -> 1
  3. -3 -> 11

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力:

class Solution {
    public int pathSum(TreeNode root, int sum) {
        if(root == null){
            return 0;
        }
        return help(root,sum) + pathSum(root.left,sum) + pathSum(root.right,sum);
    }

    private int help(TreeNode root, int sum) {
        if(root == null){
            return 0;
        }
        sum -= root.val;
        return (sum == 0 ? 1 : 0) + help(root.left,sum)+help(root.right,sum);
    }
}

哈希表解法,来源题解:

class Solution {
    public int pathSum(TreeNode root, int sum) {
        if (root == null) {
            return 0;
        }
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0,1);
        return help(root,sum,map,0);
    }

    private int help(TreeNode root, int sum,HashMap<Integer,Integer> map,int path) {
        int res = 0;
        if(root == null){
            return 0;
        }
        path += root.val;
        res += map.getOrDefault(path-sum,0);
        map.put(path,map.getOrDefault(path,0) +1);
        res += help(root.left,sum,map,path) + help(root.right,sum,map,path);
        map.put(path,map.get(path) - 1);
        return res;
    }
}

本题与和为k的子数组思路基本一致,只是将数组变为树,需要一个回溯的过程

发布了258 篇原创文章 · 获赞 5 · 访问量 5343

猜你喜欢

转载自blog.csdn.net/weixin_43105156/article/details/104142358