题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:用栈记录路径,sum记录当前和。如果是叶结点,判断sum是否等于target,如果等于则输出。help的方法最后需要将栈顶弹出,sum-=。
public static void findPath(TreeNode root, int target) {
if (root == null)
return;
Stack<TreeNode> stack = new Stack<TreeNode>(); // 存储遍历点
List<ArrayList> lists = new ArrayList<ArrayList>(); // 存储结果路径
helpFindPath(lists, stack, root, 0, target);
for (ArrayList<TreeNode> list : lists) { // 最终的结果输出
for (TreeNode node : list)
System.out.print(node.val + " ");
System.out.print("\n");
}
}
public static void helpFindPath(List<ArrayList> lists, Stack<TreeNode> stack, TreeNode root, int sum, int target) {
if (root == null)
return;
stack.push(root);
sum += root.val;
if (sum == target) { // 结果存储到list<ArrayList>
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
for (TreeNode node : stack)
list.add(node);
lists.add(list);
}
helpFindPath(lists, stack, root.left, sum, target);
helpFindPath(lists, stack, root.right, sum, target);
stack.pop();
sum -= root.val;
}