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:

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

ac1: divide & conquer

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

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

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;
    }
}

Last updated