二叉排序树Word文档格式.docx
- 文档编号:20816869
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:13
- 大小:151.51KB
二叉排序树Word文档格式.docx
《二叉排序树Word文档格式.docx》由会员分享,可在线阅读,更多相关《二叉排序树Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
VisualC++6.0以上编译环境
任务
要求
1、搜集二叉排序树方面的资料;
2、编写代码,实现二叉排序树的创建,中序遍历,计算其平均查找长度,查找和删除某个结点;
3、撰写课程设计报告;
4、参加答辩。
工作进度计划
序号
起止日期
工作内容
1
2009.6.8
搜集二叉排序树方面的资料
2
2009.6.9-10
编写代码,上机调试
3
2009.6.11
撰写课程设计报告
4
2009.6.12
答辩
指导教师:
2009年6月10日
摘要:
数据结构是研究与数据之间的关系,我们称这一关系为数据的逻辑结构,简称数据结构。
当数据的逻辑结构确定以后,数据在物理空间中的存储方式,称为数据的存储结构。
相同的逻辑结构可以具有不同的存储结构,因而有不同的算法。
本次课程设计,程序中的数据采用“树形结构”作为其数据结构。
二插链表存储结构中二插树的结点由一个数据元素和分别指向其左、右子树的两个分支构成。
具体采用的是“二叉排序树”,并且使用“一维数组”来作为其存储结构。
一维数组顺序表存储结构是用一组地址连续的存储单元依次自上而下、自左而右存储完全二叉树上的结点元素;
建立二插排序树采用边查找边插入的方式。
查找函数采用递归的方式进行查找。
如果查找成功则不应再插入原树,否则返回当前结点的上一个结点。
然后利用插入函数将该元素插入原树。
本课程设计实现了二叉排序树的创建、中序遍历、计算二叉排序树的平均查找长度和删除二叉排序树中某个结点。
关键词:
二叉排序树;
中序遍历;
平均查找长度;
删除结点
目录
1需求分析5
1.1课程设计题目、任务及要求5
1.2课程设计思想5
1.3软硬件运行环境及开发工具5
1.4分工人员及分工6
2概要设计6
2.1二叉排序树的定义6
2.2一维数组的存储结构6
2.3建立二叉排序树6
2.4二叉排序树的生成过程7
2.5中序遍历二叉树7
2.6二叉排序树的查找8
2.7二叉排序树的插入8
2.8二叉排序树的删除8
2.9平均查找长度9
3详细设计和实现10
3.1模块设计10
4调试与操作说明11
总结13
致谢14
参考文献15
1需求分析
1.1课程设计题目、任务及要求
二叉排序树。
用顺序表(一维数组)作存储结构
(1)以回车('
-1'
)为输入结束标志,输入数列L,生成一棵二叉排序树T;
(2)对二叉排序树T作中序遍历,输出结果;
(3)计算二叉排序树T查找成功的平均查找长度,输出结果;
(4)输入元素x,查找二叉排序树T:
若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);
否则输出信息“无x”;
1.2课程设计思想
建立二叉排序树采用边查找边插入的方式。
对二叉树进行中序遍历采用递归函数的方式。
在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。
计算二插排序树的平均查找长度时,仍采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。
平均查找长度就等于s/i(i为树中结点的总个数)。
删除结点函数,采用边查找边删除的方式。
如果没有查找到,则不对树做任何的修改;
如果查找到结点,则分四种情况分别进行讨论:
1、该结点左右子树均为空;
2、该结点仅左子树为空;
3、该结点仅右子树为空;
4、该结点左右子树均不为空。
1.3软硬件运行环境及开发工具
Windows2000以上操作系统、MicrosoftVisualC++6.0
1.4分工人员及分工
成员:
周俊,朱宁
朱宁:
负责资料的查找,ppt的制作以及主程序部分的编写和对程序的审查
周俊:
资料的汇编以及程序各模块的编写以及对程序的调试修改和ppt的补充说明。
2概要设计
2.1二叉排序树的定义
二叉排序树是一种动态树表。
二叉排序树的定义:
二叉排序树或者是一棵空树,
或者是一棵具有如下性质的二叉树:
⑴若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
⑵若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
⑶左、右子树本身又各是一棵二叉排序树。
2.2一维数组的存储结构
建立二插排序树,首先用一个一维数组记录下读入的数据,然后再用边查找边插入的方式将数据一一对应放在完全二叉树相应的位置,为空的树结点用“0”补齐。
2.3建立二叉排序树
从空的二叉排序树开始,经过一系列的查找插入操作以后,生成了一棵二叉排序树。
根据二叉排序树的定义,建立一棵二叉排序树的过程是按照待排序序列元素的先后次序,不断动态生成二叉树的结点,逐个插入到二叉树中。
若p为根结点指针,b为当前待插入元素,其过程可以描述为:
(1)若为空树(p=nil),动态生成一个结点,其数据域为当前待插入元素b,左、右指针域为“空”,p指向该结点。
(2)若非空树,比较b与根结点数据data(p)
如果b<data(p),将b插入左子树中;
如果b≥data(p),将b插入右子树中;
左、右子树的插入方式与二叉排序树的插入方式相同。
不断调用上述的插入过程,直到所有待排序序列均排入后,就形成一棵二叉排序树。
由此可见,建立二叉排序树就是多次调用二叉排序树的插入算法。
2.4二叉排序树的生成过程
二叉排序树的生成,采用递归方式的边查找边插入的方式。
如图:
图2.4.1二叉排序树生成流程图
2.5中序遍历二叉树
中序遍历二叉树算法的框架是:
若二叉树为空,则空操作;
否则
(1)中序遍历左子树(L);
(2)访问根结点(V);
(3)中序遍历右子树(R)。
中序遍历二叉树也采用递归函数的方式,先访问左子树2i,然后访问根结点i,最后访问右子树2i+1.先向左走到底再层层返回,直至所有的结点都被访问完毕。
2.6二叉排序树的查找
在二叉排序树上进行查找,是一个从根结点开始,沿某一个分支逐层向下进行比较叛等的过程。
它可以是一个递归的过程。
假设我们想要在二叉排序树中查找关键码为x的元素,查找过程从根结点开始。
如果根指针为NULL,则查找不成功;
否则用给定值x与根结点的关键码进行比较;
如果给定值等于根结点的关键码,则查找成功,返回查找成功的信息,并报告查找到的结点地址。
如果给定值小于根结点的关键码,则继续递归查找根结点的左子树;
否则,递归搜索根结点的右子树。
2.7二叉排序树的插入
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。
为了向二叉排序树中插入一个新元素,必须先检查这个元素是否在树中已经存在。
所以在插入之前,先使用查找算法在树中检查要插入的元素有还是没有。
如果搜索成功,说明树中已经有这个元素,不再插入;
如果搜索不成功,说明树中原来没有关键码等于给定值的结点,把新元素加到搜索操作停止的地方。
插入过程:
若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;
当非空时,将待插结点关键字S->
key和树根关键字t->
key进行比较,
若s->
key=t->
key,则无须插入,若s->
key<
t->
key,则插入到根的左子树中,
>
key,则插入到根的右子树中。
而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。
2.8二叉排序树的删除
2.9平均查找长度
计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。
假设在含有n(n>
=1)个关键字的序列中,i个关键字小于第一个关键字,n-i-1个关键字大于第一个关键字,则由此构造而得的二叉排序树在n个记录的查找概率相等的情况下,其平均查找长度为:
ASL(n,i)=[1+i*(P(i)+1)+(n-i-1)(P(n-i-1)+1)]/n
其中P(i)为含有i个结点的二叉排序树的平均查找长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(n-i-1)+1为查找右子树中每个关键字时所用比较次数的平均值。
又假设表中n个关键字的排列是“随机”的,即任一个关键字在序列中将是第1个,或第2个,…,或第n个的概率相同,则可对上式从i等于0至n-1取平均值。
最终会推导出:
当n>
=2时,ASL(n)<
=2(1+1/n)ln(n)
由此可见,在随机的情况下,二叉排序树的平均查找长度和log(n)是等数量级的。
另外,含有n个结点的二叉排序树其判定树不是惟一的。
对于含有同样一组结点的表,由于结点插入的先后次序不同,所构成的二叉排序树的形态和深度也可能不同。
3详细设计和实现
3.1模块设计
程序主要设计了五个功能:
首先是创建二叉排序树,完成后出现任务菜单,菜单中设计了四个模块:
退出,中序遍历,计算平均查找长度和删除结点。
主函数流程如下:
图3.1.1主函数流程图
4调试与操作说明
4.1建立二叉树
输入几位数,以-1作为结束标志,这里输入5,12,31,8,1,9六位数
最后输入-1结束,程序现实以下界面:
选择1,建立二叉排序树,
4.2插入节点
输入2,在二叉树中插入一个节点,这里输入的是节点是18,
显示重新排列后的树,
4.3寻找节点
选择3,寻找一个节点,输入8,程序显示“发现”;
输入11,
程序显示“没有发现”,
4.4删除节点
选择4,删除一个节点,这里输入8,重新排序后,程序显示如下,
总结
课程设计是培养学生综合运用所学知识,发现提出分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际能力的具体训练和考察过程。
回顾数据设计这些日子,至今我感慨颇多,的确,学到了很多的东西包括以前在课本上没有学到的知识,还使我懂的了理论和时间结合是很重要
通过这次课程设计,我加深了对数据结构这门课程的理解,更好的掌握了各种二叉数的递归与非递归,树与二叉树的转换以及树的前序和后序的递归,非递归算法,层次序的非递归算法的实现,更巩固了自己的C和C++的知识,用C++做完课程设计,增强了自己的自学能力。
做了这次课程设计,我觉得课程设计这种形式真的是我们需要的,可以让我们学到很多,包括书上的、书外的。
在学排序算法的时候,读了书上的算法描述,觉得自己都会了,但真的到编程去实现它的时候,却不是一次就成功的,总会出点差错,只得一次次改,等到程序终于正确运行的时候,才算真正会了这些算法,理论和实际永远差那么一点,不去做是体会不出来的。
坐在电脑前才真正知道自己会不会,眼高手低是要不得的。
通过课程设计还提高了一点改错能力,对于一些常见问题加深了印象。
每次课程设计都会有多多少少的收获,这些收获将成为以后学习中一笔不可或缺的财富。
致谢
在此,首先要感谢我的老师,感谢他在百忙之中还抽出时间来指导我、帮助我顺利地完成课程设计。
在本次课程设计中,我从指导老师身上学到了很多东西。
他认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅。
他无论在理论上还是在实践中,都给与我很大的帮助,使我得到很大的提高,这对于我以后的工作和学习都是巨大的帮助,在学术上指导老师是一个严谨求实,认真负责的人。
他不辞辛劳,对我的课题给予了大量的指导,提出了宝贵的意见,在此感谢他耐心的辅导。
其次我要感谢计算机系所有的老师们,没有他们平时的教导,我不会顺利完成我的课程设计。
是他们不辞辛苦、勤勤恳恳、任劳任怨、不厌其烦地给我们讲解计算机的专业课程。
面对专业知识不那么深厚的我们,老师们一遍又一遍试图用最易懂的方式让我们透彻理解那些高深的专业理论。
我还要感谢我的父母,使他们给了我这样一个机会,我会好好珍惜,以求更好的成绩感谢他们。
我还要感谢我的同学,没有他们的支持和鼓励,我不可能在学习中不断进步。
我们互相加油互相扶持,谢谢他们。
参考文献
1.魏雪萍.新编Word2003入门与提高.北京:
人民邮电出版社,2005
2.王宏生.数据结构.北京:
国防出版社,2006.1
3.潭浩强.程序设计.北京:
清华大学出版社,2000
4.严蔚敏,吴伟民.数据结构.北京:
清华大学出版,2001
5.殷人昆.数据结构.北京:
清华大学出版社,2004
6.王晓东.数据结构与算法设计.电子工业出版社2002
7.陈慧南.数据结构与算法C++语言描述.高等教育出版社2005
8.窦延平等.数据结构与算法C++.上海交通大学出版社2005
指导教师评语
学号
1071304136
姓名
朱宁
班级
网络107
选题
评价内容
权重(%)
得分
考勤记录、学习态度、工作作风与表现。
5
自学情况:
上网检索机时数、文献阅读情况(笔记)。
10
论文选题是否先进,是否具有前沿性或前瞻性。
成果验收:
是否完成设计任务;
能否运行、可操作性如何等。
20
报告的格式规范程度、是否图文并茂、语言规范及流畅程度;
主题是否鲜明、重心是否突出、论述是否充分、结论是否正确;
是否提出了自己的独到见解。
30
6
文献引用是否合理、充分、真实。
7
答辩情况:
自我陈述、回答问题的正确性、用语准确性、逻辑思维、是否具有独到见解等。
25
合计
指导教师(签章):
2009年6月30日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉排序树