246. Binary Tree Path Sum II [LintCode]

Your are given a binary tree in which each node contains a value. Design an algorithm to get all paths which sum to a given value. The path does not need to start or end at the root or a leaf, but it must go in a straight line down.

Example

Given a binary tree:

    1
   / \
  2   3
 /   /
4   2

for target =6, return

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

针对DFS的每一步到达的节点,从当前节点往前一直到根节点,去找”截止到当前节点等于target的序列“,每找到一个就创建一个子序列。DFS函数中用level来标记当前的层数,好从buffer里找到对应的value。

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

    private void dfs(TreeNode root, int target, List<Integer> buffer, int level, List<List<Integer>> results) {
        if (root == null) {
            return;
        }        
        buffer.add(root.val);
        int sum = target;
        for (int i = level; i >= 0; i--) {
            sum -= buffer.get(i);
            if (sum == 0) {
                List<Integer> path = new ArrayList<Integer>();
                for (int j = i; j <= level; j++) {
                    path.add(buffer.get(j));
                }
                results.add(path);
            }
        }
        dfs(root.left, target, buffer, level + 1, results);
        dfs(root.right, target, buffer, level + 1, results);
        buffer.remove(buffer.size() - 1);
    }
}

同样的题在LeetCode中437. Path Sum III 求的是个数,犯了严重错误,count在DFS中不能携带着来计数!!在这个例子中,count只能从某个节点往下延续,而不能延续到同层的其他节点中。

// WRONG CODE !!!
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int pathSum(TreeNode root, int sum) {
        int count = 0;
        List<Integer> buffer = new ArrayList<Integer>();
        dfs(root, buffer, sum, count);
        return count;
    }

    private void dfs(TreeNode root, List<Integer> buffer, int sum, int count) {
        if (root == null) {
            return;
        }
        buffer.add(root.val);
        int target = sum;
        for (int i = buffer.size() - 1; i >= 0; i--) {
            target -= buffer.get(i);
            if (target == 0) {
                count++;
            }
        }
        dfs(root.left, buffer, sum, count);
        dfs(root.right, buffer, sum, count);
        buffer.remove(buffer.size() - 1);
    }
}

// CORRECT CODE !!!
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private int count;

    public int pathSum(TreeNode root, int sum) {
        this.count = 0;
        List<Integer> buffer = new ArrayList<Integer>();
        dfs(root, buffer, sum);
        return this.count;
    }

    private void dfs(TreeNode root, List<Integer> buffer, int sum) {
        if (root == null) {
            return;
        }
        buffer.add(root.val);
        int target = sum;
        for (int i = buffer.size() - 1; i >= 0; i--) {
            target -= buffer.get(i);
            if (target == 0) {
                this.count++;
            }
        }
        dfs(root.left, buffer, sum);
        dfs(root.right, buffer, sum);
        buffer.remove(buffer.size() - 1);
    }
}

results matching ""

    No results matching ""