• 基于数组完成顺序二叉树


    法一:

      给定一个数组a[MAXSIZE],若父结点为a[k] (k != 0),则其左子结点为a[2k],右子结点为a[2k+1],左子结点的左子结点为a[(2^2)*k],左子结点的右子结点为a[(2^2)*k+1],右子结点的左子结点为a[(2^2)*k+2],右子结点的右子结点为a[(2^2)*k+3]......

      可以推导出,深度为n的第一个结点的左子结点(位于n+1层)为a[(2^n)*k],另一个子结点即右子结点为a[2^n)*k+1]

      那么我们要求出深度为n+1时的任一结点,只要将其数组下标与深度的关系得出即可列出一个等式,令返回值==等式值即可,时间复杂度为O(1)

    法二:

      通过上图我们发现如果完全二叉树的一个父结点编号为k,那么它左儿子的编号就是2*k,右儿子的编号就是2*k+1。如果已知儿子(左儿子或右儿子)的编号是x,那么它父结点的编号就是x/2,注意这里只取商的整数部分。在C语言中如果除号‘/’两边都是整数的话,那么商也只有整数部分(即自动向下取整),即4/2和5/2都是2。另外如果一棵完全二叉树有N个结点,那么这个完全二叉树的高度为log2 N简写为log N,即最多有log N层结点。

    代码实现

    public class ArrBinaryTree {
    
        private int[]arr;//存储数据
    
        public ArrBinaryTree(int[] arr) {
            this.arr = arr;
        }
    
        /*顺序存储二叉树*/
        /**
         *
         * @description:前序遍历
         * @params:1.数组下标
         * @return:
         * @author: 苏兴旺
         * @time: 2020/3/13 14:25
         */
        public  void  preOrder(int index){
            if (arr==null || arr.length==0){
                System.out.println("数组为空!不能前序遍历");
                return;
            }
            /*输出当前元素*/
            System.out.println(arr[index]);
            //左递归遍历
            if (index*2+1<arr.length){
                preOrder(2*index+1);
            }
            //右递归遍历
            if (index*2+2<arr.length){
                preOrder(index*2+2);
            }
        }
    
        /*中序遍历*/
        public  void infixOrder(int index){
            //左递归
            if (index *2+1<arr.length){
                infixOrder(index*2+1);
            }
            //输出当前节点
            System.out.println(arr[index]);
            //右递归
            if (index*2+2<arr.length){
                infixOrder(index*2+2);
            }
        }
    
        /*后序遍历*/
        public  void postOrder(int index){
            //左递归
            if (index*2+1<arr.length){
                postOrder(index*2+1);
            }
            //右递归
            if (index*2+2<arr.length){
                postOrder(index*2+2);
            }
            //当前节点
            System.out.println(arr[index]);
        }

    进行测试

    public class ArrBinaryTreeDemo {
        public static void main(String[] args) {
            int[] arr ={1,2,3,4,5,6,7};
            ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
    
          /*  //前序遍历
            System.out.println("前序遍历:");
            arrBinaryTree.preOrder(0);
    
            //中序遍历
            System.out.println("中序遍历:");
            arrBinaryTree.infixOrder(0);
    
            //后序遍历
            System.out.println("后序遍历:");
            arrBinaryTree.postOrder(0);*/
        }
    }
  • 相关阅读:
    IntelliJ IDEA 16创建Web项目
    Error running Tomcat8: Address localhost:1099 is already in use 错误解决
    Hibernate的三种状态
    Hibernate 脏检查和刷新缓存机制
    Windows服务器时间不同步问题
    解决Windows内存问题的两个小工具RamMap和VMMap
    实现多线程异步自动上传本地文件到 Amazon S3
    JS判断用户连续输入
    ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤
    bootstrap的popover在trigger设置为hover时不隐藏popover
  • 原文地址:https://www.cnblogs.com/sxw123/p/12804335.html
Copyright © 2020-2023  润新知