后序遍历二叉树(最复杂)
原因是需要对每个要访问的根节点进行判断:如果该节点的右孩子还未被访问,则需要先处理右孩子
如果右孩子没有,或者是右孩子已经被访问过,那么就可以访问该节点了
思路一:每个从栈顶弹出的根节点(基本上)需要弹出两次,第一次弹出,判断右孩子;第二次弹出,判断已经通过,访问节点;
思路二:每个节点从栈顶读取一次,再弹出一次。
应用一:求某节点的所有祖先
遍历到 该节点时,此时栈里存放的依次就是全部祖先
后序遍历每个节点时,判断该节点值是否是X,若是,输出栈内所有元素,若不是,继续后序遍历。
/* * 给出根节点和一个节点的值,找出这个节点的所有祖先节点并且将他们打印出来(非递归方式)
*/
public void ancestor2(Node node,int x){
Node[] qu=new Node[255];
int flag=0;
int k=0;
Node pre=null;
Node p=node;
if(p!=null){
qu[k++]=p;
p=p.getLeft();
while(k>0){
while(p!=null){
qu[k++]=p;
p=p.left;
}
pre=null;
flag=1;
while(flag==1&&k>0){
p=qu[k-1];
if(p.right==pre){
k--;
if(p.data==x){
for(int i=0;i<=k;i++){
System.out.print(qu[i].getData()+" ");
}
}
pre=p;
}
else{
p=p.right;
flag=0;
}
}
}
}