动态查找表二叉排序树.docx
《动态查找表二叉排序树.docx》由会员分享,可在线阅读,更多相关《动态查找表二叉排序树.docx(19页珍藏版)》请在冰豆网上搜索。
![动态查找表二叉排序树.docx](https://file1.bdocx.com/fileroot1/2022-11/22/c1d2e444-e204-4ce5-860f-b05014b12a39/c1d2e444-e204-4ce5-860f-b05014b12a391.gif)
动态查找表二叉排序树
理工大学某某学院计算机学院课程设计
动态查找表
摘要
数据结构是研究与数据之间的关系我们称这一关系为数据的逻辑结构简
称数据结构。
当数据的逻辑结构确定以后数据在物理空间中的存储方式称为
数据的存储结构。
一样的逻辑结构可以具有不同的存储结构因而有不同的算法。
本次课程设计程序中的数据采用“树形结构〞作为其数据结构。
具体采用
的是“二叉排序树〞并且使用“二叉链表〞来作为其存储结构。
本课程设计实
现了二叉排序树的创建、中序遍历、插入、查找和删除二叉排序树中某个结点。
本课程主要实现动态查找表的功能通过“二叉排序树〞的算法和“二叉链
表〞的存储结构来实现。
本课程设计说明书重点介绍了系统的设计思路、总体设
计、各个功能模块的设计与实现方法。
关键词数据结构C语言二叉排序树动态二叉链表
1
理工大学某某学院计算机学院课程设计
2
摘要.................................................1
1ABSTRACT............................................3
2
3抽象数据类型动态查找表定义......................4
4
3系统总体分析.......................................5
3.1系统模块划分........................................5
3.2二叉树的生成过程...................................5
3.3主要功能模块设计...................................5
3.4系统详细设计.......................................7
3.4.1主函数菜单模块...................................7
3.4.2查找模块........................................10
3.4.3删除模块........................................11
3.4.4插入模块........................................13
3.4.5中序输出模块....................................15
参考文献..............................................17
心得体会.......................................18
教师评语.......................................19
附录................................................20
2
理工大学某某学院计算机学院课程设计
1Abstract(摘要)
Datastructureistherelationshipbetweenresearchanddata,wecall
thisrelationshipasalogicaldatastructure,referredtoasdata
structures.Whenthedatalogicalstructureisdetermined,thedatastored
inthephysicalspace,isknownasthedatastoragestructure.Thesame
logicalstructurecanhavedifferentstoragestructure,whichhasa
differentalgorithm.
Thecurriculumdesign,programdatais"tree"asitsdatastructure.
Specificuses"binarysorttree"anduse"binarylist"asitsstorage
structure.Thecourseisdesignedtoachieveabinarysorttreecreation,
in-ordertraversal,insert,findanddeleteabinarysorttreenodes.
Thiscourseismainlythefunctionofdynamiclook-uptable,through
the"binarysearchtree"algorithmand"binarylist"ofstoragestructures.
Thiscourseisdesignedtohighlightthesystemdesignconcept,overall
design,eachfunctionalmoduledesignandimplementation.
Keywords:
CLanguageDataStructureDynamicBinarySearchTree,
BinaryList
3
理工大学某某学院计算机学院课程设计
2抽象数据类型动态查找表定义
ADTDynamicSearchTable{
数据对象DD是具有一样特性的数据元素的集合。
各个数据元素含有类型一样
可唯一标识数据元素的关键字。
数据关系R:
数据元素同属一个集合。
根本操作P
InitDSTable(&DT);
操作结果构造一个空的动态查找表DT。
DestroyDSTable&DT;
初始条件动态查找表DT存在。
操作结果销毁动态查找表DT。
SearchDSTableDTkey;
初始条件动态查找表DT存在key为和关键字类型一样的给定值。
操作结果假如DT中存在其关键字等于key的数据元素如此函数值为该元素的
值或在表中的位置否如此为“空〞。
InsertDSTable&DTe;
初始条件动态查找表DT存在e为待插入的数据元素。
操作结果假如DT中不存在其关键字等于e的数据元素如此插入e到DT。
DeleteDSTable&DTkey;
初始条件动态查找表DT存在key为和关键字类型一样的给定值。
操作结果假如DT中存在其关键字等于key的数据元素如此删除之。
InOrderTraverse(DT);
初始条件动态查找表DT存在。
操作结果按中序的次序输出DT中的每个结点数据值。
}ADTDynamisSearchTable
4
理工大学某某学院计算机学院课程设计
5
3系统总体分析
二叉排序树是一种动态树表。
二叉排序树的定义二叉排序树或者是一棵空树或者是一棵具有如下性
质的二叉树
⑴假如它的左子树非空如此左子树上所有结点的值均小于根结点的值
⑵假如它的右子树非空如此右子树上所有结点的值均大于根结点的值
⑶左、右子树本身又各是一棵二叉排序树。
3.2二叉树的生成过程
二叉排序树的生成采用递归方式的边查找边插入的方式。
如图
3.3主要功能模块设计
程序主要设计了五个功能首先是创建二叉排序树完成后出现任务菜单
菜单中设计了六个模块查找删除插入中序输出清屏和退出。
5
理工大学某某学院计算机学院课程设计
N
Y
N
Y
N
Y
N
Y
N
Y
N
Y
N
Y
N
图2.3主函数流程图
理工大学某某学院计算机学院课程设计
3.4系统详细设计
3.4.1主函数菜单模块
该模块功能主要是给用户提供清晰的可操作界面易于人机操作并能很好
的调用其他各模块使程序更加优化丝路更加清晰结构更加明了提高了程
序的实用性。
其代码如下
#include"BinaryTree.h"
voidmain(){
BiTreeT=NULL;
intarr[100];
intn,i,k;
intdata;
InitBiTree(T);
printf("请输入结点数");
scanf("%d",&n);
printf("请输入数据");
for(i=0;i//输入要排序的数据
scanf("%d",&arr[i]);
}
for(i=0;i//构造二叉排序树
InsertBiTree(T,arr[i]);
}
printf("按中序输出");
InOrderTraverse(T);//调用中序输出函数将二叉排序树按中序输出
printf("\n");
Z:
{
//语句块供用户选择操作
7
理工大学某某学院计算机学院课程设计
printf("\t\t---------------------------\n");
printf("\t\t|功能菜单|\n");
printf("\t\t---------------------------\n");
printf("\t\t|1.查找数据|\n");
printf("\t\t---------------------------\n");
printf("\t\t|2.删除数据|\n");
printf("\t\t---------------------------\n");
printf("\t\t|3.插入数据|\n");
printf("\t\t---------------------------\n");
printf("\t\t|4.输出有序序列|\n");
printf("\t\t---------------------------\n");
printf("\t\t|5.清屏|\n");
printf("\t\t---------------------------\n");
printf("\t\t|6.退出|\n");
printf("\t\t---------------------------\n\n");
X:
{
//该语句块用于循环选择
printf("请输入选择功能的序号");
V:
{
//该语句块用于输入序号错误时重新输入
scanf("%d",&k);
}//endV
switch(k){
case1:
printf("请输入要查找的数据");
scanf("%d",&data);
if(InsertBiTree(T,data)){
printf("不存在数据元素%d\n",data);
}
else{
8
理工大学某某学院计算机学院课程设计
printf("存在数据元素%d\n",data);
}
break;
case2:
printf("请输入要删除的数据");
scanf("%d",&data);
if(!
DeleteBiTree(T,data)){
printf("不存在要输出的数据%d\n",data);
}
else{
printf("删除操作成功\n");
}
break;
case3:
printf("请输入要插入的数据");
scanf("%d",&data);
if(!
InsertBiTree(T,data)){
printf("要插入的数据%d已存在插入失败\n",data);
}
else{
printf("插入操作成功\n");
}
break;
case4:
printf("有序序列为");
InOrderTraverse(T);
printf("\n");
break;
case5:
system("cls");
9
理工大学某某学院计算机学院课程设计
10
gotoZ;
break;
case6:
DestroyBiTree(T);
exit(0);
default:
printf("输入字符错误请重新输入:
");
gotoV;
}//endswitch
printf("\n\n");
}//endX
gotoX;
}//endZ
}
3.4.2查找模块
该模块是给用户提供查找功能。
其查找过程是假如二叉排序树为空如此查找失败完毕查找返回信息NULL否如此将要查找的值与二叉排序树根结点的值进展比拟假如相等如此查找成功完毕查找返回被查找到结点的地址假如不等如此根据要查找的值与根结值的大小关系决定时到根结点的左子树还是右子树中继续查找查找过程同上直到查找成功或者查找失败为止。
其代码如下:
StatusSearchBiTree(BiTreeT,Elemkey,BiTreef,BiTree&p){
//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据
元素
//假如查找成功如此指针p指向该数据元素结点并返回TRUE否如此
指针p
//指向查找路径上访问的最后一个结点并返回FALSE指针f指向T
的双亲其初始调用值为NULL
if(!
T){
p=f;
returnFALSE;//查找不成功
}
elseif(key==T->data){
p=T;
returnTRUE;//查找成功
}
elseif(keydata){
//在左子树中继续查找
return(SearchBiTree(T->left,key,T,p));
}
else{
//在右子树中继续查找
return(SearchBiTree(T->right,key,T,p));
}
}
3.4.3删除模块
删除结点函数采用边查找边删除的方式。
如果没有查找到如此不对树做任何的修改;如果查找到结点如此分四种情况分别进展讨论
A该结点左右子树均为空可以直接进展删除
B该结点仅左子树为空右子树不为空用右子树的根结点取代被删除结
点的位置
C该结点仅右子树为空左子树不为空
D该结点左右子树均不为空找到被删除结点左子树中最大的结点并用
该结点取代被删除节点的位置。
其代码如下
StatusDelete(BiTree&p){
//从二叉排序树中删除结点p并重接它的左或右子树
BiTreeq,s;
//q=(BiTree)malloc(sizeof(BiTree));
//s=(BiTree)malloc(sizeof(BiTree));
if(!
p->right){
//右子树为空如此重接它的左子树
q=p;
p=p->left;
q->left=NULL;
//free(q);有错误
}
elseif(!
p->left){
//只需重接它的右子树
q=p;
p=p->right;
q->right=NULL;
//free(q);//有错误
}
else{
//左右子树都不空
q=p;
s=p->left;
while(s->right){
q=s;
s=s->right;//转右然后向右走到尽头找到被删点的“前
驱〞
}
p->data=s->data;//s指向被删结点的“前驱〞
s->data=NULL;
if(q!
=p){
q->right=s->left;//重接*q的右子树
}
else{
q->left=s->left;//重接*q的左子树任何的修改如果查找到结点如此分四种情况分别进展讨论
A该结点左右子树均为空可以直接进展删除
B该结点仅左子树为空右子树不为空用右子树的根结点取代被删除结
点的位置
C该结点仅右子树为空左子树不为空
D该结点左右子树均不为空找到被删除结点左子树中最大的结点并用
该结点取代被删除节点的位置。
其代码如下
StatusDelete(BiTree&p){
//从二叉排序树中删除结点p并重接它的左或右子树
BiTreeq,s;
//q=(BiTree)malloc(sizeof(BiTree));
//s=(BiTree)malloc(sizeof(BiTree));
if(!
p->right){
//右子树为空如此重接它的左子树
q=p;
p=p->left;
q->left=NULL;
//free(q);有错误
}
elseif(!
p->left){
//只需重接它的右子树
q=p;
p=p->right;
q->right=NULL;
//free(q);//有错误
}
else{
//左右子树都不空
q=p;
s=p->left;
while(s->right){
q=s;
s=s->right;//转右然后向右走到尽头找到被删点的“前
驱〞
}
p->data=s->data;//s指向被删结点的“前驱〞
s->data=NULL;
if(q!
=p){
q->right=s->left;//重接*q的右子树
}
else{
q->left=s->left;//重接*q的左子树
}
//free(s);有错误
}
returnTRUE;
}
StatusDeleteBiTree(BiTree&T,Elemkey){
//假如二叉排序树T中存在关键字等于key的数据元素时
//如此删除该数据元素结点并返回TRUE否如此返回FALSE
if(!
T){
returnFALSE;//不存在关键字等于key的数据元素
}
else{
if(key==T->data){
returnDelete(T);//找到关键字等于key的数据元素
}
elseif(key<=T->data){
//从左子树继续查找等于key的数据元素
returnDeleteBiTree(T->left,key);
}
else{
//从右子树继续查找等于key的数据元素
returnDeleteBiTree(T->right,key);
}
}
}
3.4.4插入模块
在二叉排序树种插入新结点要保证插入后的二叉树仍符合二叉排序树的
定义。
插入过程假如二叉排序树为空如此待插入结点*p作为根结点插入到空树
中当非空时将待插结点关键字p->item和树根关键字t->item进展比拟
假如p->item=t->item如此无须插入假如p->itemitem如此插入到根的左子
树中假如p->item>t->item如此插入到根的右子树中。
而子树种的插入过程和
在树中的插入过程一样如此进展下去直到把结点*p作为一个新的树叶插入
到二叉排序树中或者直到发现数已有一样关键字的结点为止。
其代码如下
StatusInsertBiTree(BiTree&T,Elemkey){
//当二叉排序树T中不存在关键字等于key的数据元素时插入key并返回TRUE
//否如此返回FALSE
BiTrees=NULL;
BiTreep=NULL;
if(!
SearchBiTree(T,key,NULL,p)){
s=(BiTree)malloc(sizeof(BiTree));
if(!
s){
//内存分配失败时给出提示然后退出操作
printf("内存空间分配失败\n");
exit(OVERFLOW);
}
s->data=key;
s->left=s->right=NULL;
if(!
p){
T=s;
}
elseif(keydata){
p->left=s;
}
else{
p->right=s;
}
returnTRUE;
}
else
returnFALSE;
}
3.4.5中序输出模块
遍历Traversal是指沿着某条搜索路线依次对树中每个结点均做一
次且仅做一次访问。
访问结点所做的操作依赖于具体的应用问题。
二叉树共有
三个局部组成即根结点根结点的左子树根结点的右子树。
限定以从左至
右方式共有三种遍历方式即前序遍历中序遍历后序遍历。
中序遍历的原
如此假如被遍历的二叉树为非空如此依次执行如下操作
A以中序遍历方式遍历左子树
B访问根结点
C以中序遍历方式遍历右子树。
其代码如下
StatusInsertBiTree(BiTree&T,Elemkey){
//当二叉排序树T中不存在关键字等于key的数据元素时插入key并返
回TRUE
//否如此返回FALSE
BiTrees=NULL;
BiTreep=NULL;
if(!
SearchBiTree(T,key,NULL,p)){
s=(BiTree)malloc(sizeof(BiTree));
if(!
s){
//内存分配失败时给出提示然后退出操作
printf("内存空间分配失败\n");
exit(OVERFLOW);
}
s->data=key;
s->left=s->right=NULL;
if(!
p){
T=s;
}
elseif(keydata){
p->left=s;
}
else{
p->right=s;
}
returnTRUE;
}
else
returnFALSE;
}
图2.4.5
16
理工大学某某学