---
# System prepended metadata

title: 0113. Path Sum II
tags: [Leetcode, FaceBook, Medium, Backtracking]

---

# 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);
        }
    }
}
```