二叉排序树及其应用算法与数据课程设计Word文档下载推荐.docx
- 文档编号:21008264
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:99.04KB
二叉排序树及其应用算法与数据课程设计Word文档下载推荐.docx
《二叉排序树及其应用算法与数据课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二叉排序树及其应用算法与数据课程设计Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
,7654321
。
在上表的基础上完成二叉排序树的建立、插入、删除。
四、算法思想
1、二叉排序树的查找,即给定值先与根结点比较,若相等则查找成功,否则根据根据他们之间的大小关系,分别在左子树或右子树查找。
2、二叉排序树的插入,插入的一定是叶子结点,根据查找结果决定插入位置。
3、二叉排序树的删除分三种情况:
1)若*p结点为叶子结点,即PL和PR均为空树。
由于删除叶子结点不破坏整棵树的结构,则只需改其双亲结点的指针即可。
2)若*p结点只有左子树PL或者只有右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树即可。
3)若*p的左右子树均不空。
令*p的左子树为*s的左子树,*p的右子树为*s的右子树,如图。
4、在通讯录管理系统的设计中都基于上述二叉排序树的思想。
五、模块化分
1.二叉排序树
1).Search(p,data)
查找二叉排序树中元素。
2).Traverse(p)
中序遍历二叉排序树。
3).Insert(*p,t)
插入结点t。
4).Delete(p,e)
删除值为e的结点
5).main
主函数
2.通讯录
1).Searchnumber(p,data)
查找通讯录中的号码,查找成功输出号码和对应姓名
2).Traverse(p)
查看通讯录中所有号码,按大小顺序排列
3).Insert(*p,s)
添加新号码
4).Delete(p,data)
删除号码
5).Main
用while循环和switch选择结构进行操作
六、数据结构//(ADT)
1.二叉排序树
ADTBinarySortTree{
数据对象:
intTElemTypedata;
数据关系:
BSTNode*lchild,rchild;
基本操作:
Search(p,data);
初始条件:
p、data存在
操作结果:
遍历查找成功输出值
Insert(*p,t);
p,t存在
操作结果:
将t插入到p中
Traverse(p);
p存在
中序遍历输出二叉排序树
Delete(p,e);
p、e存在
删除二叉排序树中结点值为e的结点
}ADTBinarySortTree
2.通讯录
ADTtongxunlu{
name,number;
Search(p,data.number);
}ADTtongxunlu
七、源程序
#include<
stdlib.h>
stdio.h>
#defineNULL0
#defineFALSE0
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<
(b))
typedefintTElemType;
typedefstructBSTNode{
TElemTypedata;
structBSTNode*lchild,*rchild;
}BSTNode,*BSTree;
//在二叉排序树中查找
BSTreeSearch(BSTreeT,TElemTypedata){
BSTNode*p;
p=T;
if(p==NULL)returnNULL;
elseif(p->
data==data)returnp;
elseif(data<
p->
data)returnSearch(p->
lchild,data);
elsereturnSearch(p->
rchild,data);
}
//在二叉排序树中插入一个新结点
voidInsert(BSTree*p,BSTreet){
if(*p==NULL)*p=t;
elseif(t->
data<
(*p)->
data)Insert(&
((*p)->
lchild),t);
data>
rchild),t);
//中序遍历所建二叉排序树
voidTraverse(BSTreep){
if(p!
=NULL){
Traverse(p->
lchild);
printf("
%5d"
p->
data);
rchild);
}
voidDelete(BSTreeT,TElemTypee)
{
BSTNode*p,*f,*s,*q;
f=NULL;
while(p)
{if(p->
data==e)
break;
f=p;
if(p->
e)
p=p->
lchild;
else
rchild;
//找不到要删除点
if(p==NULL)
printf("
nomatch"
);
//p左子树空或右子树空
if((p->
lchild==NULL)||(p->
rchild==NULL))
//p为根
{if(f==NULL)
lchild=NULL)
T=p->
T=p->
//p无左子树
elseif(p->
lchild==NULL)
if(f->
lchild==p)
f->
lchild=p->
else
f->
rchild=p->
//p无右子树
elseif(f->
free(p);
//p有左右孩子
else
{q=p;
s=p->
while(s->
rchild)
{q=s;
s=s->
if(q==p)
q->
lchild=s->
rchild=s->
data=s->
data;
free(s);
voidMainMenue()
{fflush(stdin);
\n**************MainMenue******************\n"
****\n"
**1.Traverse**\n"
**2.search**\n"
**3.insert**\n"
**4.delete**\n"
**0.Exit.**\n"
**********************************************\n"
voidmain()
intflag;
BSTreep,s,q;
charch;
Pleaseinputdatas(999999:
end):
\n"
//建立一棵二叉排序树,元素值从键盘输入,直到输入关键字等于9999为止
scanf("
%4d"
&
p=NULL;
while(data!
=999999){
s=(BSTree)malloc(sizeof(BSTNode));
s->
data=data;
s->
rchild=NULL;
Insert(&
p,s);
%d"
Createiscompleted\n"
while(flag)
{
MainMenue();
Pleaseinputyourchoice(0~4):
"
ch=getchar();
switch(ch){
case'
1'
:
Traverse(p);
//中序遍历已建立的二叉排序树
printf("
break;
case'
2'
printf("
Inputthedatayouwanttosearch:
scanf("
s=Search(p,data);
if(s!
=NULL)printf("
success,thevalueis%4d\n"
s->
elseprintf("
nomatchdata!
3'
Inputthedatayouwanttoinsert:
q=(BSTree)malloc(sizeof(BSTNode));
q->
lchild=q->
Insert(&
p,q);
4'
Inputthedatayouwanttodelete:
Delete(p,data);
case'
0'
exit(0);
}}}
//应用
typedefstructInfo{
charname[20];
//姓名
intnumber;
//电话
}DataType;
DataTypedata;
BSTreeSearchnumber(BSTreeT,intnumber){
if(p==NULL)returnNULL;
elseif(p->
data.number==number)returnp;
elseif(number<
data.number)returnSearchnumber(p->
lchild,number);
elsereturnSearchnumber(p->
rchild,number);
data.number<
data.number)Insert(&
data.number>
Traverse(p->
%d,%4s"
data.number,p->
data.name);
voidDelete(BSTreeT,inte)
data.number==e)
if(f->
else{
q=p;
while(s->
q=s;
data.number=s->
data.number;
{inti;
DataTypea[7]={
{"
1314520},
3344520},
1314025},
3344025},
1234567},
3142267},
4384383},
};
输入号码和姓名:
for(i=0;
i<
7;
i++)
{s=(BSTree)malloc(sizeof(BSTNode));
data=a[i];
Traverse(p);
查找:
3344520"
s=Searchnumber(p,3344520);
号码:
%d,姓名%2s\n"
data.number,s->
未找到您需要的号码!
添加号码7654321,大黄"
strcpy(q->
data.name,"
data.number=7654321;
删除号码1234567"
Delete(p,1234567);
八、测试情况
程序的测试结果如下:
1.二叉排序树的测试结果:
输入数据遍历
查找
插入
删除
2.应用通讯录管理
九、参考文献
1、严蔚敏,《数据结构C语言》,清华大学出版社。
2、谭浩强,《c语言程序设计》,清华大学出版社。
小结
通过这次课程设计除了平时老师给予我们树的教导外还让我们对二叉排序树有了更深一层次的了解,对树的结构,树的一些基本操作有了一定的掌握。
二叉排序树与次优二叉树相对,二叉排序树是一种动态树表。
其特点是:
树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。
新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。
它至多每个结点有两个孩子。
还有左右之分,不能调换。
正因为排序树的这种性质使它在搜索,插入,删除中很强的逻辑性。
他不像普通的树删除结点是没有意义的,因为他的有序使他在不被删除时任要考虑其孩子的排列是他们满足原来的关系。
在查找中由于根结点选取不同他的平均查找长度又有不同,最差为(n+1)/2;
最简单是log2n。
在此次设计中,我们遇到了很多问题。
例如在删除节点的时候,不知道如何去连接删除结点后的剩余子树。
经过我们几个的讨论和资料的查阅,了解到如何去完成它,即当被删除结点为叶子结点时直接删除,当不是叶子结点的时候,选取该结点的左子树的最右结点等。
最终将删除结点操作完成了。
整个程序设计中偶尔有一点一点语法的错误,经过仔细检查及程序系统的提示下,问题得以解决。
通过课程设计让本组成员学到了很多,也使我更深刻地意识到,其实每个人都是很坚强的,每个人在平时学习和生活中都有潜在的能力未曾发挥出来,只要有信心、有勇气去面对,就没有解决不了的难题。
通过这段时间的磨合不断加深了我和组员之间的友谊,在过程中寻找快乐,在感悟中得到升华!
此次的设计也让我们了解和学习到很多的东西,二叉排序树在现代社会有着非常广泛的应用。
随着社会信息的丰富化,检索也越来越重要。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉排序树 及其 应用 算法 数据 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)