後序遍歷二叉樹(最複雜)
原因是需要對每個要訪問的根節點進行判斷:如果該節點的右孩子還未被訪問,則需要先處理右孩子
如果右孩子沒有,或者是右孩子已經被訪問過,那麼就可以訪問該節點了
思路一:每個從棧頂彈出的根節點(基本上)需要彈出兩次,第一次彈出,判斷右孩子;第二次彈出,判斷已經通過,訪問節點;
思路二:每個節點從棧頂讀取一次,再彈出一次。
應用一:求某節點的所有祖先
遍歷到 該節點時,此時棧裏存放的依次就是全部祖先
後序遍歷每個節點時,判斷該節點值是否是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;
}
}
}
}