欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二叉树的遍历

程序员文章站 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));
	}
}

二叉树的遍历

效率不可同日而语

相关标签: 集合