题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ /
5 12
/ /
4 7
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ /
5 12
/ /
4 7
则打印出两条路径:10, 12和10, 5, 7。
/**
* 找到和为某值的二叉树
*/
public void findPath(int sum){
/*Node<T> leftChild = null;
Node<T> rightChild = null;*/
Node<T> previous = null;//右侧标志位本层访问节点,对下层是前一节点
boolean left = true;//左侧标志位
Stack<Node<T>> s = new Stack<Node<T>>();
int totalSum = 0;
s.push(this.root);//root为二叉树的跟节点
Node<T> iterator = root;
while(!s.isEmpty()){
while(left){
totalSum+=visitInt(iterator);
if(totalSum==sum){
printPath(s);
System.out.println(iterator.data);//最后一个节点还没入栈
}
if(iterator.left!=null){
s.push(iterator);
iterator = iterator.left;
}else{
left = false;
}
}
if(iterator.right!=null&&previous!=iterator.right){
s.push(iterator);
iterator = iterator.right;
previous = iterator;
left = true;
}else{
totalSum-=visitInt(iterator);
left = false;
previous = iterator;
iterator = s.pop();
}
}
}
private int visitInt(Node<T> root){
return (Integer)root.data;
}
private void printPath(Stack<Node<T>> s){
Object[] array = s.peekAll(); //peekALL返回堆栈内部的数组
for(int i=1;i<s.size();i++){
System.out.print(((Node<Integer>)array[i]).data+"-->");
}
}