动态查找表二叉排序树.docx

上传人:b****6 文档编号:3381001 上传时间:2022-11-22 格式:DOCX 页数:19 大小:303.13KB
下载 相关 举报
动态查找表二叉排序树.docx_第1页
第1页 / 共19页
动态查找表二叉排序树.docx_第2页
第2页 / 共19页
动态查找表二叉排序树.docx_第3页
第3页 / 共19页
动态查找表二叉排序树.docx_第4页
第4页 / 共19页
动态查找表二叉排序树.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

动态查找表二叉排序树.docx

《动态查找表二叉排序树.docx》由会员分享,可在线阅读,更多相关《动态查找表二叉排序树.docx(19页珍藏版)》请在冰豆网上搜索。

动态查找表二叉排序树.docx

动态查找表二叉排序树

理工大学某某学院计算机学院课程设计

 

动态查找表

摘要

数据结构是研究与数据之间的关系我们称这一关系为数据的逻辑结构简

称数据结构。

当数据的逻辑结构确定以后数据在物理空间中的存储方式称为

数据的存储结构。

一样的逻辑结构可以具有不同的存储结构因而有不同的算法。

本次课程设计程序中的数据采用“树形结构〞作为其数据结构。

具体采用

的是“二叉排序树〞并且使用“二叉链表〞来作为其存储结构。

本课程设计实

现了二叉排序树的创建、中序遍历、插入、查找和删除二叉排序树中某个结点。

本课程主要实现动态查找表的功能通过“二叉排序树〞的算法和“二叉链

表〞的存储结构来实现。

本课程设计说明书重点介绍了系统的设计思路、总体设

计、各个功能模块的设计与实现方法。

关键词数据结构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:

CLanguageDataStructureDynamicBinarySearchTree,

BinaryList

3

理工大学某某学院计算机学院课程设计

2抽象数据类型动态查找表定义

ADTDynamicSearchTable{

数据对象DD是具有一样特性的数据元素的集合。

各个数据元素含有类型一样

可唯一标识数据元素的关键字。

数据关系R:

数据元素同属一个集合。

根本操作P

InitDSTable(&DT);

操作结果构造一个空的动态查找表DT。

DestroyDSTable&DT;

初始条件动态查找表DT存在。

操作结果销毁动态查找表DT。

SearchDSTableDTkey;

初始条件动态查找表DT存在key为和关键字类型一样的给定值。

操作结果假如DT中存在其关键字等于key的数据元素如此函数值为该元素的

值或在表中的位置否如此为“空〞。

InsertDSTable&DTe;

初始条件动态查找表DT存在e为待插入的数据元素。

操作结果假如DT中不存在其关键字等于e的数据元素如此插入e到DT。

DeleteDSTable&DTkey;

初始条件动态查找表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

理工大学某某学

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1