二叉樹後序遍歷

後序遍歷二叉樹(最複雜)

原因是需要對每個要訪問的根節點進行判斷:如果該節點的右孩子還未被訪問,則需要先處理右孩子

                                                                        如果右孩子沒有,或者是右孩子已經被訪問過,那麼就可以訪問該節點了

思路一:每個從棧頂彈出的根節點(基本上)需要彈出兩次,第一次彈出,判斷右孩子;第二次彈出,判斷已經通過,訪問節點;

思路二:每個節點從棧頂讀取一次,再彈出一次。

 

應用一:求某節點的所有祖先

              遍歷到 該節點時,此時棧裏存放的依次就是全部祖先

              後序遍歷每個節點時,判斷該節點值是否是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;
                    }
                }
            }
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章