Java实现二叉树的建立、计算高度与递归输出操作示例

所属分类: 软件编程 / java 阅读数: 30
收藏 0 赞 0 分享

本文实例讲述了Java实现二叉树的建立、计算高度与递归输出操作。分享给大家供大家参考,具体如下:

1. 建立 递归输出 计算高度 前中后三种非递归输出

public class Tree_Link {
    private int save = 0;
    private int now = 0;
    Scanner sc = new Scanner(System.in);
    /*
     * 构造函数
     */
    Tree_Link(){
    }
    /*
     * 链表建立
     */
    public Tree Link_Build(Tree head){
//        Tree head = new Tree();//头节点
        System.out.println("继续code:1");
        int flag = sc.nextInt();
        if(flag != 1){
            return head;
        }else{
            System.out.println("\n\n\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);//设置父母节点
                Link_Build( head.GetLtree() );
            }
            System.out.println("\n当前位置:" + 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);//设置父母节点
                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当前位置:" + 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;//退出标记
        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;//退出标记
        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){//因为左边为空而返回
                    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 ){//因为左边为空而返回
                    System.out.println( "<-2--中序遍历--->" + head.GetCode());
                }
                head = head.GetFronttree();
                if( area == 2){//因为左边访问完返回
                    System.out.println( "<-3--中序遍历--->" + head.GetCode());
                }
                System.out.println("获得 父母" + head.GetCode());
                System.out.println( "\n\n\n" );
            }
        }
    }
    /*
     * 非递归 后续遍历
     */
    public void Bottom_Traverse(Tree head){
        Tree star = head;//退出标记
        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){//因为右边为空而返回
                    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 类实现:

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;
    }
    /*
     * 树内容查看方法:
     */
    public void SetCode(int code){//设置编号
        this.code = code;
    }
    public int GetCode(){     //获取编号
        return this.code;
    }
    /*
     * 设置父母指针:
     */
    public void SetFronttree(Tree Front){
        this.Fonttree = Front;
    }
    public Tree GetFronttree(){
        System.out.println("获得 父母");
        return this.Fonttree;
    }
    /*
     * 设置左子女:
     */
    public void SetLtree(Tree Ltree){
        this.Ltree = Ltree;
    }
    public Tree GetLtree(){
        System.out.println("获得左子树");
        return this.Ltree;
    }
    /*
     * 设置右子女:
     */
    public void SetRtree(Tree Rtree){
        this.Rtree = Rtree;
    }
    public Tree GetRtree(){
        System.out.println("获得右子树");
        return this.Rtree;
    }
}

3. 主函数测试:

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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

更多精彩内容其他人还在看

Java Set简介_动力节点Java学院整理

Set最大的特性就是不允许在其中存放的元素是重复的。接下来通过本文给大家分享java set常用方法和原理分析,需要的的朋友参考下吧
收藏 0 赞 0 分享

Java Timezone类常见问题_动力节点Java学院整理

这篇文章主要介绍了Java Timezone类常见问题的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

javaWeb项目部署到阿里云服务器步骤详解

本篇文章主要介绍了javaWeb项目部署到阿里云服务器步骤详解,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解使用zxing库生成QR-Code二维码

这篇文章主要介绍了详解使用zxing库生成QR-Code二维码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现对服务器的自动巡检邮件通知

这篇文章主要为大家详细介绍了java实现对服务器的自动巡检邮件通知,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java随机验证码生成实现实例代码

这篇文章主要介绍了java随机验证码生成实现实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

java读取txt文件代码片段

这篇文章主要为大家详细介绍了java读取txt文件的代码片段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java连接mysql数据库的方法

这篇文章主要为大家详细介绍了java连接mysql数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java 算法之快速排序实现代码

这篇文章主要介绍了java 算法之快速排序实现代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

这篇文章主要介绍了详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多