• [LeetCode] 113. Path Sum II


    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

    Note: A leaf is a node with no children.

    路径总和II。

    题意跟版本一很接近,唯一的不同是版本一只是问是否有满足条件的路径;版本二是输出所有满足条件的路径和。

    Example:

    Given the below binary tree and sum = 22,

          5
         / 
        4   8
       /   / 
      11  13  4
     /      / 
    7    2  5   1
    

    Return:

    [
       [5,4,11,2],
       [5,8,4,5]
    ]

    这题我只会用DFS做。这个题也有那么点backtracking的味道在里面,因为要求你输出所有的情况,需要回溯。同类型题还有1457

    时间O(n)

    空间O(h)

    注意JS实现里面的21行为什么要将最后一个节点弹出(等同于Java里面的23行)。我举个例子,比如5,4,11,7都加入list之后,发现5+4+11+7 != 22,此刻一定要将7删除,才能接着去看右子树(2),否则在做右子树递归的时候,最后的加法是5+4+11+7+2。

    JavaScript实现

     1 /**
     2  * @param {TreeNode} root
     3  * @param {number} sum
     4  * @return {number[][]}
     5  */
     6 var pathSum = function(root, sum) {
     7     let res = [];
     8     if (root === null) return res;
     9     helper(res, [], root, sum);
    10     return res;
    11 };
    12 
    13 var helper = function(res, list, root, sum) {
    14     if (root) {
    15         list.push(root.val);
    16         if (!root.left && !root.right && sum - root.val === 0) {
    17             res.push([...list]);
    18         }
    19         helper(res, list, root.left, sum - root.val);
    20         helper(res, list, root.right, sum - root.val);
    21         list.pop();
    22     }
    23     return res;
    24 };

    Java实现

     1 class Solution {
     2     public List<List<Integer>> pathSum(TreeNode root, int sum) {
     3         List<List<Integer>> res = new ArrayList<>();
     4         if (root == null) {
     5             return res;
     6         }
     7         helper(res, new ArrayList<>(), root, sum);
     8         return res;
     9     }
    10 
    11     private void helper(List<List<Integer>> res, List<Integer> list, TreeNode root, int sum) {
    12         if (root == null) {
    13             return;
    14         }
    15         list.add(root.val);
    16         if (root.left == null && root.right == null) {
    17             if (sum == root.val) {
    18                 res.add(new ArrayList<>(list));
    19             }
    20         }
    21         helper(res, list, root.left, sum - root.val);
    22         helper(res, list, root.right, sum - root.val);
    23         list.remove(list.size() - 1);
    24     }
    25 }

    相关题目

    112. Path Sum

    113. Path Sum II

    1457. Pseudo-Palindromic Paths in a Binary Tree

    LeetCode 题目总结

  • 相关阅读:
    Day6
    Day6
    Day6
    Day6
    Day6
    Day6
    LeetCode "The Skyline Problem"
    HackerRank
    HackerRank
    HackerRank
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12182638.html
Copyright © 2020-2023  润新知