437-路径总和 III

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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    // <K,V>:<sum,路径数>
    Map<Integer, Integer> map = new HashMap<>();

    public int pathSum(TreeNode root, int sum) {
        if (root == null) {
            return 0;
        }
        scan(root);
        return map.getOrDefault(sum, 0);
    }

    // 自底向上,逐步求和,并存入map
    private List<Integer> scan(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root.left != null) {
            list.addAll(scan(root.left));
        }
        if (root.right != null) {
            list.addAll(scan(root.right));
        }

        List<Integer> sum = new ArrayList<>();
        for (Integer i : list) {
            sum.add(root.val + i);
            map.put(root.val + i, map.getOrDefault(root.val + i, 0) + 1);
        }
        sum.add(root.val);
        map.put(root.val, map.getOrDefault(root.val, 0) + 1);

        return sum;
    }

上述改进的话,可以把传入的参数sum用全部变量记录,每次root.val + i == sum时可以用全局变量cnt进行cnt++

如果对同一棵树有多次调用,上面的方法可能比较合适。

双重递归:

    int pathnumber;

    public int pathSum(TreeNode root, int sum) {
        if (root == null) return 0;
        getSum(root, sum);
        pathSum(root.left, sum);
        pathSum(root.right, sum);
        return pathnumber;
    }

    // 自顶向下,逐步递减
    public void getSum(TreeNode root, int sum) {
        if (root == null) return;
        sum -= root.val;
        if (sum == 0) {
            pathnumber++;
        }
        getSum(root.left, sum);
        getSum(root.right, sum);
    }

猜你喜欢

转载自www.cnblogs.com/angelica-duhurica/p/12238142.html