二叉树的遍历

二叉树比较高效的结构,当用来数值排序时感觉和折半查找很像,运算次数相当的少,比如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));
	}
}

效率不可同日而语

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值