amor详解 二叉排序树的使用以及理解

本文详述了二叉排序树的概念、性质、遍历方法及其实现方式,强调其在减少循环使用上的优势,并通过代码示例展示了如何仅用一个循环完成数组排序,同时探讨了其内存消耗的缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

amor详解 二叉排序树的使用以及理解

  

前言:

     二叉排序树是当今唯一一种只用一个循环就能进行排序的算法,java程序中用的循环越少,那么执行的时间越短,速度越快,这个我在上一次已经讲过了,具体内容请移步  http://www.liaoguodong.cn/ 作者 amor

     二叉排序树,那么肯定会用到树的概念,那么我们先扫扫盲,讲讲树的理论。

     一、树状结构

      如图

     

      上图显示的就是一个简单的树状结构,N2该节点有两个子节点,N0表示该节点没有子节点

概念:

度:度你也可以说是节点,如图中12表的的就是度

二叉树:一个度小于等于二的数为二叉树 ,也就是说,1号节点只能有23两个节点,23号节点也只能有小于等于二个节点的树

深度(或者所高度):树的最大层数  如图的树为三层

有数二叉树:如果一个树通过中根遍历得到一个有序的数就叫有序二叉树  这个后面会重点讲

  ......

树的三大性质:

1. 高度为h的二叉树,节点最多为 =2h次方 -1

2. 第i层最大的节点个数为=2i-1次方

3. N0=N2+1  解释:N0的个数等于N2的个数+1

树的遍历方法

图:


1.先根遍历    遍历顺序-->根左右  对应 213  根在前面  

2.中根遍历    遍历顺序-->左根右  对应 123  根在中间 ,中根遍历可以遍历数组

3.后根遍历    遍历顺序-->左右根  对应 132  根在后面

其实树的概念很多很多,在这儿我主要是想讲讲它的使用,所以也就不过多的列举,下面来说说使用

首先,我们定义一个树的节点

//树节点定义

public class TreeNode {

int data;

    //定义树的左右节点

TreeNode left;

TreeNode right;

public TreeNode(int data) {

this.data = data;

//当新建一个数的时候,没有左右节点,所以设置为null

left=null;

right=null;

}

}


保存为 TreeNode .java

然后新建一个二叉排序法.java 文件实现排序

public class 二叉排序法 {

//中根遍历法

static int k=0;

public static void mid_root(TreeNode root,int[] a){

//访问left节点(左子树)

//有left才访问

if(root.left!=null){

mid_root(root.left,a);

}

//存回数组,如果不存回数组,那么原数组将不会改变,所以这一步不能遗漏

a[k++]=root.data;  //相当于:a[k]=root.data;  k++;

//访问右子树(right)

if(root.right!=null){

mid_root(root.right,a);

}

}

//这儿是对树的一个位置摆放

public static void sort_tree(TreeNode root,TreeNode in){

//比大小,决定in放在左边还是右边

if(root.data>in.data){

//左边

if(root.left==null)

root.left=in;

else

sort_tree(root.left, in);

}else{

//右边

if(root.right==null)

root.right=in;

else

sort_tree(root.right, in);

}

}

public static void main(String[] args) {

int[] a={5,1,8,4,2,7,3,6,9};

    //有些朋友,在看下面一句的时候,以为放的是一个数组,当时在TreeNode中并没//有定义这样的一个构造方法,其实,a[0] 表示的是一个int类型的数a[0]=5

//给树一个根节点    

TreeNode root=new TreeNode(a[0]);

for(int i=1;i<a.length;i++){

TreeNode in=new TreeNode(a[i]);

sort_tree(root, in);

}

//调用排序的算法

mid_root(root,a);

for(int i=0;i<a.length;i++)

System.out.print(a[i]+"-");

}

}



通过上面的调用,我们就知道实现了对一个数组只用一个循环来实现。

后记:

  浅谈一下二叉树排序的优缺点

  首先优点:很显然,二叉树排序只是使用了一个循环,那么在执行速度上比起冒泡,快速排序等等快的多,在时间上很占优势。 但是缺点,二叉树排序会消耗较多的内存,在内存中构建一个数,然后排序。所以根据不同的条件,会选用不同的方法,例如,别人的服务器是2G,那么我搞一个200G的内存,那么我肯定是选用二叉排序,以追求最大的速度。 但是我们仍然肯定二叉排序时一个好的算法。 

声明:此文仅仅是和大家分享自己所知道的,其中有一部分概念不准确也请大家多多谅解,指出批评,谢谢。也欢迎你光临我的博客  http://www.liaoguodong.cn/ 

  

作者amor


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值