# 0113. Path Sum II
###### tags: `Leetcode` `Medium` `FaceBook` `Backtracking`
Link: https://leetcode.com/problems/path-sum-ii/
## 思路 O(N^2) O(N)
**注意所有backtracking时间复杂度的分析**
这里不涉及到剪枝 因为每个node的val不一定都是正数
要注意题目有一个限定条件是结束的点必须是leaf node
时间复杂度:假设这个tree一共有N个node, 那么worst case leaf node就会有N/2个,那么就会有N/2个路径要尝试,每条路径的时间复杂度是O(N)(其实应该是tree的高度,但是因为不是balance tree,所以高度不能用logN表示),因此时间复杂度是O(N^2)
空间复杂度:如果不考虑output的空间复杂度,是O(N) 因为用了curr list记录现在路径上有的node
## Code
```java=
class Solution {
List<List<Integer>> ans;
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
ans = new ArrayList<>();
if(root == null) return ans;
List<Integer> curr = new ArrayList<>();
curr.add(root.val);
backtracking(root, targetSum, curr, root.val);
return ans;
}
public void backtracking(TreeNode root, int target, List<Integer> curr, int currSum){
if(currSum==target && root.left==null && root.right==null){
ans.add(new ArrayList<>(curr));
return;
}
if(root.left!=null){
curr.add(root.left.val);
backtracking(root.left, target, curr, currSum+root.left.val);
curr.remove(curr.size()-1);
}
if(root.right!=null){
curr.add(root.right.val);
backtracking(root.right, target, curr, currSum+root.right.val);
curr.remove(curr.size()-1);
}
}
}
```