一篇文章40分钟演示如何将无序数组放到二叉树中
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章40分钟演示如何将无序数组放到二叉树中相关的知识,希望对你有一定的参考价值。
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
一篇文章、40分钟演示如何将无序数组放到二叉树中
01 设计思路:
- 将无序数组通过冒泡排序过滤成有序数组。
- 将有序数组存放到二叉树中。
实现思路: 取数组的中间元素作为中间根结点,将数组分成左右两个部分,对数组的两个部分用递归的方法分别构建左右子树。
如下:
02 冒泡排序:
03 二叉树基本概念:
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分钟演示如何将无序数组放到二叉树中的主要内容,如果未能解决你的问题,请参考以下文章
无序binarytree二叉树堆调整成小顶堆,基于节点图,非数组内操作,非递归,python