[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 }
相关题目