二叉排序树的实现课程设计说明书.doc

上传人:可**** 文档编号:49157335 上传时间:2022-10-07 格式:DOC 页数:15 大小:420KB
返回 下载 相关 举报
二叉排序树的实现课程设计说明书.doc_第1页
第1页 / 共15页
二叉排序树的实现课程设计说明书.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《二叉排序树的实现课程设计说明书.doc》由会员分享,可在线阅读,更多相关《二叉排序树的实现课程设计说明书.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、课程设计说明书摘 要数据结构是研究与数据之间的关系,我们称这一关系为数据的逻辑结构,简称数据结构。当数据的逻辑结构确定以后,数据在物理空间中的存储方式,称为数据的存储结构。相同的逻辑结构可以具有不同的存储结构,因而有不同的算法。 本次课程设计,程序中的数据采用“树形结构”作为其数据结构。具体采用的是“二叉排序树”,并且使用“一维数组”来作为其存储结构。一维数组顺序表存储结构是用一组地址连续的存储单元依次自上而下、自左而右存储完全二叉树上的结点元素;本课程设计实现了二叉排序树的创建、中序遍历、计算二叉排序树的平均查找长度和删除二叉排序树中某个结点。本课程主要介绍了本课题的开发背景,所要完成的功能

2、和开发的过程。重点说明了系统的设计思路、总体设计、各个功能模块的设计与实现方法。关键词:二叉排序树的实现;C语言;数据结构;线性表;顺序表;中序遍历。目录摘 要I1 课题背景的介绍11.1 课题背景11.2 目的12 需求分析12.1课程设计题目、任务及要求12.2课程设计思想23 系统总体设计33.1 系统模块划分33.2 二叉排序树的生成过程33.3 主要功能模块设计34 系统详细设计54.1 主函数菜单模块54.2 查找模块64.3 插入模块74.4 中序遍历模块84.5删除模块95 系统连编与运行116 总 结12参考文献13- II -1 课题背景的介绍1.1 课题背景随着经济的迅速

3、发展,各行各业纷纷应用计算机数据信息管理。当然数据信息是一个很笼统的概念,随着现代信息的大量增加,其处理难度也越来越大,如何对各个数据信息进行更好的树立,这就是我们研究这个课题的目的。在计算机迅速发展的今天,将计算机这一信息处理器应用于实际数据问题问题的信息计算已是势必所然,而且这也将数据信息处理带来前所未有的改变。采用计算机对数据的信息处理是信息科学化和现代化的重要标志,它也给各行各业带来了明显的经济效益。主要体现在:极大地提高了工作人员的工作效率,大大地减少了以往的手工操作的各种弊端,同时也加强和规范掌握对于数据信息的计算。1.2 目的本课题运用C语言进行开发,C语言能够简单的进行编译一些

4、程序,来实现对一些问题的解决。它虽然比较简单的处理一些问题,但却有更高的效率。它能够被大多数用户所接受,因为它能够呈现出清晰的界面,是人们能够很好的理解。能在一些方面给人们更好的服务,成为人们的好帮手。经过这一个学期对数据结构的学习,我们都学到了不少东西,可能有些学的还不够理想,但无论如何这些知识都为我们的下一步学习打下了坚实的基础。做这么一个课程设计,一方面是为了检查我们一个学期以来的学习成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。2 需求分析2.1课程设计题目、任务及要求二叉排序树。用顺序表(一维数组)作存储结构 (1)以回车

5、(n)为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果;(4)输入元素x,查找二叉排序树T:若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;2.2课程设计思想建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找成功则不应再插入原树,否则返回当前结点的上一个结点。然后利用插入函数将该元素插入原树。对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。计算二插排序树的平均查找长度时,仍采用

6、类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。删除结点函数,采用边查找边删除的方式。如果没有查找到,则不对树做任何的修改;如果查找到结点,则分四种情况分别进行讨论:1、该结点左右子树均为空;2、该结点仅左子树为空;3、该结点仅右子树为空;4、该结点左右子树均不为空。3 系统总体设计3.1 系统模块划分二叉排序树是一种动态树表。二叉排序树的定义:二叉排序树或者是一棵空树,或者是一棵具有如下性质的二叉树: 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; 若它的右子

7、树非空,则右子树上所有结点的值均大于根结点的值; 左、右子树本身又各是一棵二叉排序树。3.2 二叉排序树的生成过程二叉排序树的生成,采用递归方式的边查找边插入的方式。如图初始化数组插入结点是插入空树在右子树中查找否否是插入插入在左子树中查找3.3 主要功能模块设计程序主要设计了五个功能:首先是创建二叉排序树,完成后出现任务菜单,菜单中设计了四个模块:退出,中序遍历,计算平均查找长度和删除结点。主函数流程如下:否否否否否是创建二叉排序树Switch(1)中序遍历Switch(0)Exit(0)退出Switch(3)删除结点Switch(2)default提示出错计算平均查找长度是是是是是是是是

8、图3.1.1主函数流程图 4 系统详细设计4.1 主函数菜单模块 该模块功能主要是给用户提供清晰的可操作界面,易于人机操作,并能很好的调用其他各模块,使程序更加优化,丝路更加清晰,结构更加明了,提高了程序的实用性。其算法如下:Void main() node T=NULL;Int num;Int ch=0;Node p=NULL;Printf(please input a list o numbers end with zero:);Do scanf(%d,&num); If(!num) printf(you have finished your input!n); Else insertBS

9、T(&T,num); while(num);Printf(nn-the menu of the opperation-n);/*主程序菜单*/Printf(n 0: exit);Printf(n 1: inorder travel the tree);Printf(n 2: delete);While(ch=ch) printf(n choose the opperation to continue:);Scanf(%d,&ch);Switch(ch)Case 0: exit(0); /*0-退出*/Case 1: printf( The result of inorder traverse

10、is:n );Inorder Traverse(&T); /*1-中序遍历*/Break;Case 2: printf( Please input the number you want to delete:);Scanf(%d,&num); /*3-删除某个结点*/If(searchBST(T,num,NULL,&p) T=delete(T,num); Printf( You have delete the number successfully!n );InorderTravers(&T);Else printf( No node %d you want to delete!,num);B

11、reak;Default: printf(You input is wrong!Please input again!n);Break;Default: printf(Your input is wrong!Please input again!n);Break; /*输入无效字符*/ 4.2 查找模块 该模块是给用户提供查找功能。其查找过程是:若二叉排序树为空,则查找失败,结束查找,返回信息 NULL;否则,将要查找的值与二叉排序树根结点的值进行比较,若相等,则查找成功,结束查找,返回被查找到结点的地址,若不等,则根据要查找的值与根结值的大小关系决定时到根结点的左子树还是右子树中继续查找(查

12、找过程同上),直到查找成功或者查找失败为止。其算法如下:scarchBST(node,int key,node f,node *p) /*查找函数*/If(!t) *p=f;return(1); /*查找不成功*/Else if(key=t-data) searchBST(t-lchild,key,t,p); /*在左子树中继续查找*/Else searchBST(t-rchild,key,t,p); /*在右子树中继续查找*/4.3 插入模块 在二叉排序树种插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。插入过程;若二叉排序树为空,则待插入结点*p作为根结点插入到空树中;当非空时,将

13、待插结点关键字p-item和树根关键字t-item进行比较,若p-item=t-item,则无须插入,若p-itemitem,则插入到根的左子树中,若p-itemt-item,则插入到根的右子树中。而子树种的插入过程和在树中的插入过程相同,如此进行下去,直到把结点*p作为一个新的树叶插入到二叉排序树中,或者直到发现数已有相同关键字的结点为止。其算法如下:insertBST(node *t,int key) /*插入函数*/ Node p=NULL,s=NULL; If(!searchBST(*t,key,NULL,&p) /*查找不成功*/ S=(node)malloc(size(BSTnod

14、e); S-data=key; S-lchild=s-rchild=NULL; If(!p) *t=s; /*被插结点*s为新的根结点*/ Else if(keydata) p-lchild=s; /*被查结点*s为左孩子*/ Else p-rchild=s;/*被插结点*s为右孩子*/Return(1);Else return(0); /*树中已有关键字相同的结点,不再插入*/4.4 中序遍历模块 遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。二叉树共有三个部分组成,即根结点,根结点的左子树,根结点的右子树。

15、限定以从左至右方式共有三种遍历方式,即前序遍历,中序遍历,后序遍历。中序遍历的原则:若被遍历的二叉树为非空,则依次执行如下操作:A) 以中序遍历方式遍历左子树;B) 访问根结点;C) 以中序遍历方式遍历右子树。其算法如下:inorderTraverse(node *t) /*中序遍历函数*/ If(*t) If(inorderTraverse(&(*t)-lchild) /*中序遍历根的左子树*/ Printf(%d ,(*t)-data); /*中序遍历根的右子树*/Return(1);4.5删除模块 删除模块:删除结点函数,采用边查找边删除的方式。如果没有查找到,则不对树做任何的修改;如果

16、查找到结点,则分四种情况分别进行讨论:A) 该结点左右子树均为空,可以直接进行删除;B) 该结点仅左子树为空,右子树不为空,用右子树的根结点取代被删除结点的位置;C) 该结点仅右子树为空,左子树不为空;D) 该结点左右子树均不为空,找到被删除结点右子树中最小的结点,并用该结点取代被删除节点的位置。其算法如下:Node Delete(node,int key) /*删除函数*/ Node p=t,q=NULL,s,f;While(p!=NULL) /*查找要删除的点*/ If(p-data=key) break;Q=p;If(p-datakey) p=p-lchild;Else p=p-rchi

17、ld;If(p=NULL) return t; /*查找失败*/If(p-lchild=NULL) /*p指向当前要删除的结点*/ If(q=NULL) t=p-rchild; /*q指向要删除的父母*/ Else if(q-lchild=p) q-lchild=p-rchild; /*p为q的左孩子*/ Else q-rchild=p-rchild; /*p为q的右孩子*/ Free(p);Else /*p的左孩子不为空*/F=p;S=p-lchild;While(s-rchild) /*左拐后向右走到底*/ F=s; S=s-rchild;If(f=p) f-lchild; /*重接f的左

18、子树*/Esle f-rchild=s-lchild /*重接f的右子树*/P-data=s-data;Free(s);Return t;5 系统连编与运行一个应用系统设计和创建完成后,还必须进行连编,以便生成一个可执行文件供最终用户使用。连编完成后还要运行,以检查整个系统的完整性和准确性,同时还可增加程序代码的保密性。(1) 先进行编译,编译过之后再选择计算机运行。如图9所示:6 总 结通过这次课程设计我也着实又感受了一次编程的乐趣,从中也学到了不少知识。我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课程设计,我才有所领悟。这次实验中我也出现过一些比较严重的错误。在用一维数组

19、顺序表结构编写程序时我错误的运用静态链表来实现函数功能。这是我对基本概念理解的模糊不清造成的。我原以为只要采用一维数组作为存储结构它就一定也是顺序表结构,而实质上这根本是两个不相干的概念。后来在同学的指点下我意识到自己的错误。不过收获也很不少。至少我又练习了运用静态链表来实现同样的功能,同时我也发现两者在很多函数上是互通的,只需稍作修改即可移植。另外程序的不足之处是不能实现对0这个数字的存储,可以通过改变数字的存储结构方式来实现,如使用二叉链表来作为数据的存储结构,即可实现该功能。总之,我会继续我的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步不断提高的。参考文献1 谭浩强.C程序设计M.北京:清华大学出版社. 2005.2 严蔚敏. 数据结构(C语言版) M. 北京:清华大学出版社. 2008.3 陈雁.数据结构 M.北京:高等教育出版社,2004. 4 张磊.C程序设计教程.北京:中国铁道出版社.2007.5 冯舜玺.数据结构与算法分析C语言描述(原书第2版).北京:机械工业出版社,2004.16张海藩.软件工程,清华大学出版社,20087杨明军、董亚卓、汪黎.C+实用教程(第一版).人民邮电出版社.20028张荣梅、梁晓林.Visual C+实用教程(第一版).冶金工业出版社.2004第 13 页 共 13 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作计划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁