113. 路径总和 II
题目描述
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。
输入输出
1 2 3 4 5
| 输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]
输入:root = [1,2,3], targetSum = 5 输出:[]
|
基本思路
代码理解不难 可以结合 112. 路径总和
注意:第20行代码是由于 不删除的话,遍历完左子树再遍历右子树的时候,左子树的值还在path里面
时复:$O(n^2)$ 在最坏情况下,树的上半部分为链状,下半部分为完全二叉树,并且从根节点到每一个叶子节点的路径都符合题目要求。此时,路径的数目为 O(N),并且每一条路径的节点个数也为 O(N),因此要将这些路径全部添加进答案中。
空复:$O(n)$ 空间复杂度主要取决于栈空间的开销,栈中的元素个数不会超过树的节点数。
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { LinkedList<List<Integer>> res = new LinkedList<List<Integer>>(); LinkedList<Integer> path = new LinkedList<Integer>();
public List<List<Integer>> pathSum(TreeNode root, int sum) { recur(root, sum); return res; }
public void recur(TreeNode root, int target) { if(root == null) return; path.add(root.val); target -= root.val; if(target == 0 && root.left == null && root.right == null){ res.add(new LinkedList<Integer>(path)); } recur(root.left, target); recur(root.right, target); path.removeLast(); } }
|