一篇文章、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);
    }
}

运行:

在这里插入图片描述

一维数组可以用来存放完全二叉树。完全二叉树是一种特殊的二叉树,它的每个节点都按照从上到下、从左到右的顺序依次排列。我们可以使用数组来表示完全二叉树,其数组的索引表示节点的位置,数组的值表示节点的值。 具体的存储方式如下: 1. 对于完全二叉树的第i个节点,它的左子节点的索引为2i,右子节点的索引为2i+1。 2. 对于完全二叉树的第i个节点,它的父节点的索引为i/2(向下取整)。 下面是一个示例,演示如何使用一维数组存放完全二叉树,并实现先序、序和后序遍历: ```python # 定义完全二叉树的一维数组表示 tree = [None, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'] # 先序遍历 def preorder(root): if root <= len(tree) - 1: if tree[root] is not None: print(tree[root], end=' ') preorder(root * 2) # 遍历左子树 preorder(root * 2 + 1) # 遍历右子树 # 序遍历 def inorder(root): if root <= len(tree) - 1: if tree[root] is not None: inorder(root * 2) # 遍历左子树 print(tree[root], end=' ') inorder(root * 2 + 1) # 遍历右子树 # 后序遍历 def postorder(root): if root <= len(tree) - 1: if tree[root] is not None: postorder(root * 2) # 遍历左子树 postorder(root * 2 + 1) # 遍历右子树 print(tree[root], end=' ') # 演示先序、序和后序遍历 print("先序遍历结果:") preorder(1) print("\n序遍历结果:") inorder(1) print("\n后序遍历结果:") postorder(1) ``` 输出结果: ``` 先序遍历结果: A B D H I E J C F G 序遍历结果: H D I B J E A F C G 后序遍历结果: H I D J E B F G C A ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栗子~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值