题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解题思路
总体的思路是遍历二叉树,但是需要保存根节点到该节点路径的值,由于到达叶子节点后需要回退,所以使用栈的数据结构存储比较适合,直接将栈顶弹出即可。
代码
private ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if (root == null)
return new ArrayList<ArrayList<Integer>>();
Stack<Integer> stack = new Stack<Integer>();
int sum = 0;
findPath(stack, sum, root, target);
return list;
}
private void findPath(Stack<Integer> stack, int sum, TreeNode root, int target) {
stack.push(root.val);
sum = sum + root.val;
if (sum == target && root.left == null && root.right == null) {
ArrayList<Integer> resultList = new ArrayList<Integer>();
Iterator<Integer> i = stack.iterator();
while(i.hasNext()){
resultList.add(resultList.size(),i.next());
}
list.add(resultList);
}
if (root.left != null) {
findPath(stack, sum, root.left, target);
}
if (root.right != null) {
findPath(stack, sum, root.right, target);
}
stack.pop();
}