472. Binary Tree Path Sum III [LintCode]

Give a binary tree, and a target number, find all path that the sum of nodes equal to target, the path could be start and end at any node in the tree.

Example

Given binary tree:

    1
   / \
  2   3
 /
4

and target =6. Return :

[
  [2, 4],
  [2, 1, 3],
  [3, 1, 2],
  [4, 2]
]

DFS遍历嵌套DFS搜索,第一层DFS只用于移动(遍历),第二层是从当前根节点出发,往3个方向分别深度优先去搜索。

易错点:

  • 为了避免重复,设置from节点来标记当前搜索方向

  • 有可能有负数节点,因此当target为0的时候要继续搜索,搜索的出口为死胡同(叶子节点)

/**
 * Definition of ParentTreeNode:
 * 
 * class ParentTreeNode {
 *     public int val;
 *     public ParentTreeNode parent, left, right;
 * }
 */
public class Solution {
    /**
     * @param root the root of binary tree
     * @param target an integer
     * @return all valid paths
     */
    public List<List<Integer>> binaryTreePathSum3(ParentTreeNode root, int target) {
        // Write your code here
        List<List<Integer>> results = new ArrayList<>();
        dfs(root, target, results);
        return results;
    }

    private void dfs(ParentTreeNode root, int target, List<List<Integer>> results) {
        if (root == null) {
            return;
        }
        List<Integer> path = new ArrayList<Integer>();
        findSum(root, null, target, path, results);
        dfs(root.left, target, results);
        dfs(root.right, target, results);
    }

    private void findSum(ParentTreeNode root, 
                         ParentTreeNode from, 
                         int target, 
                         List<Integer> path, 
                         List<List<Integer>> results) {
        path.add(root.val);
        target = target - root.val;
        if (target == 0) {
            results.add(new ArrayList<Integer>(path));
        }  
        if (root.parent != null && root.parent != from) {
            findSum(root.parent, root, target, path, results);
        }
        if (root.left != null && root.left != from) {
            findSum(root.left, root, target, path, results);
        }
        if (root.right != null && root.right != from) {
            findSum(root.right, root, target, path, results);
        }
        path.remove(path.size() - 1);
    }
}

results matching ""

    No results matching ""