[LeetCode] 113. Path Sum II

Given the root of a binary tree and an integer targetSum, return all root-to-leaf paths where the sum of the node values in the path equals targetSum. Each path should be returned as a list of the node values, not node references.

A root-to-leaf path is a path starting from the root and ending at any leaf node. A leaf is a node with no children.

Example 1:

Input: root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
Output: [[5,4,11,2],[5,8,4,5]]
Explanation: There are two paths whose sum equals targetSum:
5 + 4 + 11 + 2 = 22
5 + 8 + 4 + 5 = 22

Example 2:

Input: root = [1,2,3], targetSum = 5
Output: []

Example 3:

Input: root = [1,2], targetSum = 0
Output: []

Constraints:

  • The number of nodes in the tree is in the range [0, 5000].
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

路径总和 II。

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

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

这题我只会用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 题目总结

posted @ 2020-01-12 14:27  CNoodle  阅读(457)  评论(0编辑  收藏  举报