一篇文章40分钟演示如何将无序数组放到二叉树中

Posted 栗子~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章40分钟演示如何将无序数组放到二叉树中相关的知识,希望对你有一定的参考价值。

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


一篇文章、40分钟演示如何将无序数组放到二叉树中

01 设计思路:

  1. 将无序数组通过冒泡排序过滤成有序数组。
  2. 将有序数组存放到二叉树中。
    实现思路: 取数组的中间元素作为中间根结点,将数组分成左右两个部分,对数组的两个部分用递归的方法分别构建左右子树。
    如下:
    在这里插入图片描述

02 冒泡排序:

30分钟掌握-冒泡排序


03 二叉树基本概念:

10分钟掌握-二叉树的基本概念


04 实战:

废话不多说,放我的练习demo源码,运行走起来(上面注释写的蛮全的):

/**
 * 二叉树模板
 * @author yangzhenyu
 * */
public class BitNode {
    int data;
    //lChild左孩子,rChild 右孩子
    BitNode lChild,rChild;

}
/**
 * 冒泡算法
 * @author yangzhenyu
 * */
public class MaoPaoUtil {
    //冒泡算法优化1 外层循环优化
    //原理:如果用一个flag来判断一下,当前数组是否已经有序,如果有序就退出循环,这样可以明显的提高冒泡排序的性能。
    public static void maoPao(int []str) {
        for (int j = 1; j < str.length; j++) {
            // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
            boolean flag = true;
            for (int i = 0; i < str.length-j; i++) {
                if (str[i]>str[i+1]) {
                    int tem = str[i];
                    str[i] = str[i+1];
                    str[i+1]=tem;
                    flag = false;
                }
            }
            if(flag) {
                break;
            }
        }
    }
}

/**
 * 将整数数组放到二叉树中
 * @author yangzhenyu
 * */
public class TreeCreate {

    /**
     * 获取一个区间的随机数
     *
     * @param min 最小
     * @param max 最大
     * @return 返回一个随机数
     */
    public static int nextInt(int min, int max) {
        return new Random().nextInt(max - min) + min;
    }
    /**
     * 创建测试数据
     * */
    public static int [] createTestData(int num){
        int [] data = new int[num];
        for (int i = 0;i<num;i++){
            data[i] = nextInt(0,1000);
        }
        return data;
    }
    /**
     * @param arr 有序数组
     * @param start 第一个索引位置
     * @param end 最后一个索引位置
     * 实现思路:取数组中间元素作为根节点,将数组分成左右两部分,对数据的两部分分别使用
     * 递归的方式分别构建左右子树
     * */
    public static BitNode arrayToTree(int [] arr,int start,int end){
        BitNode bitNode = null;
        if (end>=start){
            bitNode = new BitNode();
            int mid  = (start+end+1)/2;
            //树的根节点为中间的元素
            bitNode.data = arr[mid];
            //递归左部分数组构建左子树
            bitNode.lChild = arrayToTree(arr,start,mid-1);
            //递归右部分数组构建右子树
            bitNode.rChild = arrayToTree(arr,mid+1,end);
        }else {
            bitNode = null;
        }
        return bitNode;
    }

    /**
     * 打印顺序: 左孩子末尾左结点右结点-> 终端结点 -> 右孩子末尾左结点右结点
     * */
    public static  void printTree(BitNode root){
        if (root == null){
            return;
        }
        //遍历左结点
        if (root.lChild != null){
            printTree(root.lChild);
        }

        System.out.printf("结点值:%s\\n",root.data);
        //遍历右结点
        if (root.rChild != null){
            printTree(root.rChild);
        }

    }
    public static void main(String[] args) {
        //01 创建测试数据
        int[] testData = createTestData(17);
        //02 将无序数组转成有序数组
        MaoPaoUtil.maoPao(testData);
        //查看数组是否有序
        String data = JSON.toJSONString(testData);
        System.out.println("有序数组:"+data);
        //03 把有序数组放到二叉树中
        BitNode bitNode = arrayToTree(testData, 0, testData.length-1);
        //04 遍历二叉树
        printTree(bitNode);
    }
}

运行:

在这里插入图片描述

以上是关于一篇文章40分钟演示如何将无序数组放到二叉树中的主要内容,如果未能解决你的问题,请参考以下文章

动图演示堆排序

Java-TreeSet集合,二叉树

五分钟带你玩转平衡二叉树

无序binarytree二叉树堆调整成小顶堆,基于节点图,非数组内操作,非递归,python

求C语言高手! 1:用动画演示二叉树的三种遍历。2:绘制出一个小球,在屏幕左右端之间不停滚动。

堆排序