二叉树的遍历
程序员文章站
2022-05-23 16:21:41
...
二叉树比较高效的结构,当用来数值排序时感觉和折半查找很像,运算次数相当的少,比如1000个不同随机数,中想要去猜中其中的数值,最短的步骤就是折半二分查找,二叉树就是相同的原理,下边贴上对5万个数进行排序,冒泡和选择和二叉树三者用时对比代码。这个二叉树仿写的,知识点可能不尽善尽美。以后有空回来补充
package binary_tree;
import java.util.ArrayList;
public class Train {
//左节点
Train leftNode;
//右节点
Train rightNode;
//保存的值
Object value;
void add(Object v) {
if(value==null) {
value = v;
}else {
if((Integer)v - (Integer)value <= 0) {
if(leftNode==null) {
leftNode = new Train();
}
leftNode.add(v);
}else {
if(rightNode==null) {
rightNode = new Train();
}
rightNode.add(v);
}
}
}
//排序二叉树
ArrayList<Object> values(){
//定义集合容器用来存储值,ArrayList是有序集合在这里使用没毛病
ArrayList<Object> values = new ArrayList<>();
//没有概念初学时下边三个过程比较抽象,建议使用debug查看运行过程
//左节点 带有递归算法
if(leftNode!=null) {
values.addAll(leftNode.values());
}
values.add(value);
//右节点 带有递归算法
if(rightNode!=null) {
values.addAll(rightNode.values());
}
return values;
}
//选择排序 2,58,9,6,2,0,15,36,33,333,100
static void select(){
int[] arr = new int[50000];
for (int i = 0; i < arr.length; i++) {
//Math.random()*1000获得[0,1000)的随机数
arr[i] = (int)(Math.random()*1000);
}
long time1 = System.currentTimeMillis();
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i]>arr[j]) {
arr[i] = arr[i] + arr[j] - (arr[j] = arr[i]);
}
}
}
long time2 = System.currentTimeMillis();
System.out.println("选择排序时间:"+(time2 - time1));
}
//冒泡排序 2,58,9,6,2,0,15,36,33,100,333
static void bubble(){
int[] arr = new int[50000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random()*1000);
}
long time1 = System.currentTimeMillis();
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j]>arr[j+1]) {
int num = arr[j];
arr[j] = arr[j+1];
arr[j+1] = num;
}
}
}
long time2 = System.currentTimeMillis();
System.out.println("冒泡排序时间:"+(time2 - time1));
}
//二叉树排序
public static void main(String[] args) {
//选择排序
select();
//冒泡排序
bubble();
//二叉树排序
Train tree = new Train();
int[] arr = new int[50000];
//在这里循环后把数组中的值已经装进二叉树了,其实按照大小已经排好树状结构了,只不过不好展示
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random()*1000);
tree.add(arr[i]);
}
long time1 = System.currentTimeMillis();
//装进集合
//就直接算这里装进集合的时间了
tree.values();
long time2 = System.currentTimeMillis();
System.out.println("二叉树排序用时间"+(time2 - time1));
}
}
效率不可同日而语
上一篇: 集合(复习)
下一篇: Java基础——集合框架