二叉树后序遍历

后序遍历二叉树(最复杂)

原因是需要对每个要访问的根节点进行判断:如果该节点的右孩子还未被访问,则需要先处理右孩子

                                                                        如果右孩子没有,或者是右孩子已经被访问过,那么就可以访问该节点了

思路一:每个从栈顶弹出的根节点(基本上)需要弹出两次,第一次弹出,判断右孩子;第二次弹出,判断已经通过,访问节点;

思路二:每个节点从栈顶读取一次,再弹出一次。

 

应用一:求某节点的所有祖先

              遍历到 该节点时,此时栈里存放的依次就是全部祖先

              后序遍历每个节点时,判断该节点值是否是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;
                    }
                }
            }
        }

 

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