二叉排序树论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉排序树思想及C语言实现
摘要:本文主要是对二叉排序树的思想进行探讨,文章先从二叉排序树的定义来进行分析,然后分析其主要的性质。通过对其性质的分析,让人们了解二叉排序树的思想。从理论上分析二叉排序树的创建、删除、插入以及遍历。最后,在理论分析的基础上,运用C 语言递归算法编程实现,证实理论思想的正确性。
关键字:二叉排序树 C语言递归算法
1.引言
通过对数据结构的不断学习,对二叉排序树有了一定的了解。但在许多教材中,只是从理论上浅谈了一下二叉排序树的定义及其思想,并没有用具体算法的在计算机上实现。比如吴严敏版的数据结构教材就是这样,没有具体的实现。这对于很多的初学者来说,要看懂学会是很困难的。就此问题,本文在其理论的基础上给出了具体的算法,以便今后的学习者能够更方便的学习。为了更详细的描述二叉排序树的算法,文章采用C语言来编程实现。该算法主要描述二叉排序树的建立,删除,插入以及遍历等操作。此文是对已经出版了的关于数据结构知识的教材的补充。
2.正文
2.1 二叉排序树的定义及其性质
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:
①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
③左、右子树本身又各是一棵二叉排序树。
上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。例如图1就是两棵二叉排序树。
图 1 二叉排序树示例
从上图可以看出,一棵二叉排序树是由若干个不同的结点组成,而且每一个结点带有一个固定的值,用data来存放。每个结点拥有一棵左子树和一棵右子树,叶子结点的左子树与右
子树为空,分别用两个指针lchild、rchild来指向它。因此可以定义二叉排序树中的结点结
构如下:
typedef struct shu //定义二叉排序树结点结构
{
int data; //结点值
struct shu *lchild,*rchild; //定义结点的左孩子域与右孩子域
}shu;
2.2二叉排序树的创建
一棵二叉排序树的创建,是从空树开始的,经过多次的查找、比较和插入操作之后,即可得到一棵二叉排序树。假设要建立的序列为(45,24,12,37,53,93),则二叉排序树的生成过程如图2所示:
(1)
(2)
(3)
(4)(5)
(6)(7)
图 2 二叉排序树的构建过程
其中(1)空树,(2)插入45结点,(3)插入24结点,(4) 插入12结点
(5)插入37结点(6)插入53结点(7)插入24结点
图(7)即为序列为(45,24,12,37,53,93)所生成的二叉排序树。
下面用代码来实现二叉排序树的建立,用createshu,函数来创建二叉排序树,具体代码如下:
shu *createshu(int b , int a[MAX]) //创建二叉排序树
{
shu *l;
int i=0;
shu *s;
for(i=0;i
{
if(i= =0)
{ l=(shu *)malloc(sizeof(shu));
l->data=a[i];
l->lchild=null;
l->rchild=null;
}
else
{
s=(shu *)malloc(sizeof(shu));
s->data=a[i];
s->lchild=null;
s->rchild=null;
if(s->data>l->data)
l->rchild=lianjie(l->rchild,s); //调用连接函数
else
l->lchild=lianjie(l->lchild,s);
}
}
return l; //返回一棵二叉排序树
}
lianjie函数如下:
shu *lianjie(shu *l,shu *h) //用来连接一棵二叉排序树和一个结点
{
if(l= =null)
l=h;
else if(l->data
l->rchild=lianjie(l->rchild,h);
else
l->lchild=lianjie(l->lchild,h);
return l;
}
2.3 二叉排序树的插入
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。插入过程如下:
(1)若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;
(2)当非空时,将待插结点关键字S->data和树根关键字t->data进行比较,若s->data= t->data,则无须插入,若s->data< t->data,则插入到根的左子树中,若s->data> t->data,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。用insert函数来实现这个过程,代码如下:
shu *insert(shu *l,int a) //在一棵二叉排序树中插入一个结点a
{
shu *s;