题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
import java.util.ArrayList;
import java.util.Stack;
/**
* 二叉树中和为某一值的路径
*
* @author 过路的守望
*
*/
public class FindPath {
public static void main(String[] args) {
TreeNode h1 =new TreeNode(1);
TreeNode h2 =new TreeNode(2);
TreeNode h3 =new TreeNode(3);
TreeNode h4 =new TreeNode(9);
TreeNode h5 =new TreeNode(5);
TreeNode h6 =new TreeNode(4);
TreeNode h7 =new TreeNode(7);
h1.left = h2;
h1.right = h3;
h2.left = h4;
h2.right =h5;
h3.left = h6;
h3.right =h7;
new FindPath().getPath(h1, 8);
}
public ArrayList<ArrayList<Integer>> getPath(TreeNode root, int target) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
if (root == null) {
return lists;
}
ArrayList<Integer> list = new ArrayList<Integer>();
TreeNode pre = null;
int sum = 0;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
while (cur != null&&cur != pre) {
stack.push(cur);
sum += cur.val;
list.add(cur.val);
cur = cur.left;
}
cur = stack.peek();
/*
* 若当前节点为叶子节点且路径和为target则将路径加到lists,并将当前节点出栈,继续尝试其他节点。
*/
if (sum == target && cur.right == null) {
ArrayList<Integer> result = new ArrayList<Integer>(list);
lists.add(result);
sum -= cur.val;
list.remove(list.size() - 1);
stack.pop();
pre = cur;
if (stack.isEmpty()) {
break;
} else {
cur = stack.peek();
}
}
/*
* 若当前节点的右节点为空或已访问则将当前节点出栈
*/
if (cur.right == null || cur.right == pre) {
sum -= cur.val;
list.remove(list.size() - 1);
stack.pop();
pre = cur;
if (stack.isEmpty()) {
break;
} else {
cur = stack.peek();
}
}
cur = cur.right;
}
return lists;
}
}
/**
* 节点类
*
* @author 过路的守望
*
*/
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}