二叉排序树论文

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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->datadata)

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;

相关文档
最新文档