Java如何實(shí)現(xiàn)二叉樹的建立、計(jì)算高度與遞歸輸出操作

這篇文章主要介紹Java如何實(shí)現(xiàn)二叉樹的建立、計(jì)算高度與遞歸輸出操作,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)建站專注于余干企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城建設(shè)。余干網(wǎng)站建設(shè)公司,為余干等地區(qū)提供建站服務(wù)。全流程按需設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

具體如下:

1. 建立 遞歸輸出 計(jì)算高度 前中后三種非遞歸輸出

public class Tree_Link {
    private int save = 0;
    private int now = 0;
    Scanner sc = new Scanner(System.in);
    /*
     * 構(gòu)造函數(shù)
     */
    Tree_Link(){
    }
    /*
     * 鏈表建立
     */
    public Tree Link_Build(Tree head){
//        Tree head = new Tree();//頭節(jié)點(diǎn)
        System.out.println("繼續(xù)code:1");
        int flag = sc.nextInt();
        if(flag != 1){
            return head;
        }else{
            System.out.println("\n\n\n輸入 節(jié)點(diǎn)信息:");
            head.SetCode(sc.nextInt());
            System.out.println("\n建立 左 子樹code:1  否則:0");
            flag = sc.nextInt();
            if(flag == 1){
                now++;
                Tree LTree = new Tree();
                head.SetLtree(LTree);  
                LTree.SetFronttree(head);//設(shè)置父母節(jié)點(diǎn)
                Link_Build( head.GetLtree() );
            }
            System.out.println("\n當(dāng)前位置:" + head.GetCode());
            System.out.println("\n建立 右 子樹code:1  否則:0");
            flag = sc.nextInt();
            if(flag == 1){
                now++;
                Tree Rtree = new Tree();
                head.SetRtree(Rtree);
                Rtree.SetFronttree(head);//設(shè)置父母節(jié)點(diǎn)
                Link_Build( head.GetRtree() );
            }
            if( now > save ){
                save = now;
            }
            now--;
        }
        return head;
    }
    /*
     * 輸出樹
     */
    public Tree output(Tree head){
        int flag;
        if(head.GetCode() == -1){
            return head;
        }else{
            System.out.println("\n當(dāng)前位置:" + head.GetCode());
            System.out.println(head.GetLtree() != null);
            if(head.GetLtree() != null){
                System.out.println("\n訪問 左子樹:");
                output( head.GetLtree() );
            }
            if(head.GetRtree() != null){
                System.out.println("\n訪問 右子樹:");
                output( head.GetRtree() );
            }
        }
        return head;
    }
    /*
     * 獲得高度
     */
    public int GetSave(){
        return this.save;
    }
    /*
     * 非遞歸 前序遍歷
     */
    public void Front_Traverse(Tree head){
        Tree star = head;//退出標(biāo)記
        int choose = 1; //左
        int flag = 1;  //右
        System.out.println( "<---前序遍歷--->" + head.GetCode() );//先訪問根
        while(true){
            if( head.GetLtree() != null && choose != 0 ){
                head = head.GetLtree();
                System.out.println( "<---前序遍歷--->" + head.GetCode() );//獲得信息
                flag = 1;
            }else if( head.GetRtree() != null && flag != 0 ){
                head = head.GetRtree();
                System.out.println( "<---前序遍歷--->" + head.GetCode() );
                choose = 1;
            }else if( flag == 0 && choose == 0 && head == star){
                break;
            }else{
                if(head == head.GetFronttree().GetRtree()){
                    flag = 0;
                    choose = 0;
                }
                if(head == head.GetFronttree().GetLtree()){
                    choose = 0;
                    flag = 1;
                }
                head = head.GetFronttree();
                System.out.println("獲得 父母" + head.GetCode());
                System.out.println( "\n\n\n" );
            }
        }
    }
    /*
     * 非遞歸 中序遍歷
     */
    public void Center_Traverse(Tree head){
        Tree star = head;//退出標(biāo)記
        int choose = 1; //左
        int flag = 1;  //右
        while(true){
            if( head.GetLtree() != null && choose != 0 ){
                head = head.GetLtree();
                flag = 1;
            }else if( head.GetRtree() != null && flag != 0 ){
                if(head.GetLtree() == null){//因?yàn)樽筮厼榭斩祷?
                    System.out.println( "<-1--中序遍歷--->" + head.GetCode());
                }
                head = head.GetRtree();
                choose = 1;
            }else if( flag == 0 && choose == 0 && head == star){
                break;
            }else{
                int area = 0;//判斷哪邊回來
                flag = 1;
                choose = 1;
                if(head == head.GetFronttree().GetRtree()){
                    area = 1;//右邊回來
                    flag = 0;
                    choose = 0;
                }
                if(head == head.GetFronttree().GetLtree()){
                    area = 2;//左邊回來
                    choose = 0;
                    flag = 1;
                }
                if( head.GetLtree() == null && head.GetRtree() == null ){//因?yàn)樽筮厼榭斩祷?
                    System.out.println( "<-2--中序遍歷--->" + head.GetCode());
                }
                head = head.GetFronttree();
                if( area == 2){//因?yàn)樽筮呍L問完返回
                    System.out.println( "<-3--中序遍歷--->" + head.GetCode());
                }
                System.out.println("獲得 父母" + head.GetCode());
                System.out.println( "\n\n\n" );
            }
        }
    }
    /*
     * 非遞歸 后續(xù)遍歷
     */
    public void Bottom_Traverse(Tree head){
        Tree star = head;//退出標(biāo)記
        int choose = 1; //左
        int flag = 1;  //右
        while(true){
            if( head.GetLtree() != null && choose != 0 ){
                head = head.GetLtree();
                flag = 1;
            }else if( head.GetRtree() != null && flag != 0 ){
                head = head.GetRtree();
                choose = 1;
            }else if( flag == 0 && choose == 0 && head == star){
                break;
            }else{
                int area = 0;//判斷哪邊回來
                flag = 1;
                choose = 1;
                if(head == head.GetFronttree().GetRtree()){
                    area = 1;//右邊回來
                    flag = 0;
                    choose = 0;
                }
                if(head == head.GetFronttree().GetLtree()){
                    choose = 0;
                    flag = 1;
                }
                if(head.GetRtree() == null){//因?yàn)橛疫厼榭斩祷?
                    System.out.println( "<-1--后序遍歷--->" + head.GetCode());
                }
                head = head.GetFronttree();
                if( area == 1){
                    System.out.println( "<-2--后序遍歷--->" + head.GetCode());
                }
                System.out.println("獲得 父母" + head.GetCode());
                System.out.println( "\n\n\n" );
            }
        }
    }
}

2. Tree 類實(shí)現(xiàn):

public class Tree {
    private int code = -1;
    private Tree Fonttree;
    private Tree Ltree;
    private Tree Rtree;
    Tree(){
        this.code = -1;
        this.Ltree = null;
        this.Rtree = null;
    }
    /*
     * 樹內(nèi)容查看方法:
     */
    public void SetCode(int code){//設(shè)置編號
        this.code = code;
    }
    public int GetCode(){     //獲取編號
        return this.code;
    }
    /*
     * 設(shè)置父母指針:
     */
    public void SetFronttree(Tree Front){
        this.Fonttree = Front;
    }
    public Tree GetFronttree(){
        System.out.println("獲得 父母");
        return this.Fonttree;
    }
    /*
     * 設(shè)置左子女:
     */
    public void SetLtree(Tree Ltree){
        this.Ltree = Ltree;
    }
    public Tree GetLtree(){
        System.out.println("獲得左子樹");
        return this.Ltree;
    }
    /*
     * 設(shè)置右子女:
     */
    public void SetRtree(Tree Rtree){
        this.Rtree = Rtree;
    }
    public Tree GetRtree(){
        System.out.println("獲得右子樹");
        return this.Rtree;
    }
}

3. 主函數(shù)測試:

public class MainActivity {
    Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        Tree head = new Tree();
        Tree_Link link_1st = new Tree_Link();
        head = link_1st.Link_Build(head);
        System.out.println("Build succeed !");
        System.out.println("\n二叉樹高度-->" + link_1st.GetSave());
        link_1st.output(head);
        System.out.println("Output Over  !");
        System.out.println("\n\n<----------------前------------------>\n前序訪問根:");
        link_1st.Front_Traverse(head);
        System.out.println("\n\n<----------------中------------------>\n中序訪問根:");
        link_1st.Center_Traverse(head);
        System.out.println("\n\n<----------------后------------------>\n后序訪問根:");
        link_1st.Bottom_Traverse(head);
        System.out.println("\n\n\n\nText over !\n\n\n");
    }
}

以上是“Java如何實(shí)現(xiàn)二叉樹的建立、計(jì)算高度與遞歸輸出操作”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享題目:Java如何實(shí)現(xiàn)二叉樹的建立、計(jì)算高度與遞歸輸出操作
網(wǎng)站鏈接:http://bm7419.com/article2/psdsoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站改版、網(wǎng)站建設(shè)、網(wǎng)站排名企業(yè)建站、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作