# 0113. Path Sum II

https://leetcode.com/problems/path-sum-ii

## Description

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:**

![](https://assets.leetcode.com/uploads/2021/01/18/pathsumii1.jpg)

```
**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:**

![](https://assets.leetcode.com/uploads/2021/01/18/pathsum2.jpg)

```
**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`

## ac1: divide & conquer

* use `size() == 0` instead of `null`, return as usual

```java
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if (root == null) return res;
        if (root.left == null && root.right == null && root.val == sum) {
            List<Integer> tmp = new LinkedList<Integer>();
            tmp.add(root.val);
            res.add(tmp);
            return res;
        }

        List<List<Integer>> left = pathSum(root.left, sum - root.val);
        List<List<Integer>> right = pathSum(root.right, sum - root.val);
        if (left.size() == 0 && right.size() == 0) {
            return res;
        }

        if (left.size() != 0 && right.size() != 0) {
            left.addAll(right);
            res = left;
        } else if (left.size() == 0) {
            res = right;
        } else if (right.size() == 0) {
            res = left;
        }

        for (List<Integer> li : res) {
                ((LinkedList<Integer>)li).addFirst(root.val);
            }
        return res;
    }
}
```

## ac2: backtracking

* have a temporary list to track current result
* if condition is met, add tmp list to final result
* remove last record when return

```java
class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        List<Integer> trackNote = new ArrayList<Integer>();
        helper(res, trackNote, root, sum);
        return res;
    }

    private void helper(List<List<Integer>> res, List<Integer> trackNote, TreeNode root, int sum) {
        if (root == null) return;

        trackNote.add(root.val);

        if (root.left == null && root.right == null && root.val == sum) {
            res.add(new ArrayList<Integer>(trackNote));
        } else {
            helper(res, trackNote, root.left, sum - root.val);
            helper(res, trackNote, root.right, sum - root.val);
        }

        trackNote.remove(trackNote.size()-1);
        return;
    }
}
```
