package com.interview.books.ccinterview;
import com.interview.leetcode.utils.TreeNode;
import com.interview.leetcode.utils.TreeNodePrinter;
import com.interview.utils.ConsoleWriter;
import java.util.ArrayList;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-12-13
* Time: 下午2:33
*/
public class CC12_BinaryTreePathSum {
public List<List<Integer>> find(TreeNode root, int target){
List<List<Integer>> paths = new ArrayList<>();
traverse(root, target, new ArrayList<Integer>(), paths);
return paths;
}
//Time: O(NlgN)
public void traverse(TreeNode node, int target, List<Integer> path, List<List<Integer>> paths){
if(node == null) return;
path.add(node.val);
int sum = 0;
for(int i = path.size() - 1; i >= 0; i--){
sum += path.get(i);
if(sum == target){
paths.add(getPath(path, i, path.size() - 1));
}
}
traverse(node.left, target, path, paths);
traverse(node.right, target, path, paths);
path.remove(path.size() - 1);
}
public List<Integer> getPath(List<Integer> path, int start, int end){
List<Integer> copy = new ArrayList<>();
for(int i = start; i <= end; i++) copy.add(path.get(i));
return copy;
}
public static void main(String[] args){
TreeNode root = TreeNode.sampleBST();
TreeNodePrinter.print(root);
CC12_BinaryTreePathSum finder = new CC12_BinaryTreePathSum();
List<List<Integer>> paths = finder.find(root, 7);
ConsoleWriter.print(paths);
}
}