ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:125.14KB ,
资源ID:19123172      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19123172.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(二叉排序树与平衡二叉树的实现课程设计Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

二叉排序树与平衡二叉树的实现课程设计Word下载.docx

1、表现20%01学习态度6遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02科学实践、调研7通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。03课题工作量按期圆满完成规定的任务,工作量饱满。能力水平35%04综合运用知识的能力10能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。05应用文献的能力5能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06设计(实验)能力,方案的设计能力能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研

2、究思路清晰、完整。07计算及计算机应用能力具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。08对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)具有较强的数据收集、分析、处理、综合的能力。成果质量45%09插图(或图纸)质量、篇幅、设计(论文)规范化程度符合本专业相关规范或规定要求;规范化符合本文件第五条要求。设计说明书(论文)质量30综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。11创新对前人工作有改进或突破,或有独特见解。成绩指导教师评语指导教师签名: 年月日摘要及关键字 本程序中的数据采用“树形结构”作为其数据结

3、构。具体采用的是“二叉排序树”。二叉排序树(又称二叉查找树):(1)若左子树不空,则左子树上所有节点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有节点均大于它的根结点的值;(3)它的左右子树分别为二叉排序树。二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车(关键字:数列L,结点,二叉排序树,平衡二叉树摘要 31 绪论 51.1 课程设计的目的 51.2 相关知识的阐述 51.2.1一位数组的存储结构 5 1.2.2建立二叉排序树 51.2.3中序遍历二叉树 51.2.4

4、平均查找长度 61.2.5平均二叉树(AVL树) 61.2.6平衡因子 7 1.2.7平衡二叉树的调整方法 72 方案设计 8 2.1 模块功能83 算法设计 8 3.1 算法流程图 84 详细设计 10 4.1 主程序 10 4.2 定义二叉树结构 11 4.3 建立二叉树 114.3.1二叉排序树的查找114.3.2二叉排序树的插入11 4.4 中序遍历12 4.5 平均查找长度12 4.6 删除节点12 4.7 判断平衡二叉树 135 调试分析 14 5.1 时间复杂度的分析14 5.2 运行结果 14 5.3 结果分析 156 课程设计总结 16参考文献 17 1 绪论1.1 课程设计

5、的目的(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。(2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。(3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。1.2 相关知识的阐述1.2.1 一维数组的存储结构建立二插排序树,首先用一个一维数组记录下读入的数据,然后再用边查找边插入的方式将数据一一对应放在完全二叉树相应的位置,为空的树结点用“0” 补齐。1.2.2 建立二叉排序树 二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,

6、当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。插入算法:首先执行查找算法,找出被插结点的父亲结点;判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入;若二叉树为空,则首先单独生成根结点。注意:新插入的结点总是叶子结点。1.2.3 中序遍历二叉树中序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则(1)中序遍历左子树(L);(2)访问根结点(V);(3)中序遍历右子树(R)。中序遍历二叉树也采用递归函数的方式,先访问左子树2i,然后访问根结点i,最后访问右子树2i+1.

7、先向左走到底再层层返回,直至所有的结点都被访问完毕。1.2.4 平均查找长度计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。假设在含有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个结点的二叉排序树的平均查找

8、长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(n-i-1)+1为查找右子树中每个关键字时所用比较次数的平均值。又假设表中n个关键字的排列是“随机”的,即任一个关键字在序列中将是第1个,或第2个,或第n个的概率相同,则可对上式从i等于0至n-1取平均值。最终会推导出: 当n=2时,ASL(n)=2(11/n)ln(n)由此可见,在随机的情况下,二叉排序树的平均查找长度和log(n)是等数量级的。另外,含有n个结点的二叉排序树其判定树不是惟一的。对于含有同样一组结点的表,由于结点插入的先后次序不同,所构成的二叉排序树的形态和深度也可能不同。而在二叉排序树上进行查找时的平均

9、查找长度和二叉树的形态有关:在最坏情况下,二叉排序树是通过把一个有序表的n个结点依次插入而生成的,此时所得的二叉排序树蜕化为棵深度为n的单支树,它的平均查找长度和单链表上的顺序查找相同,亦是(n+1)/2。在最好情况下,二叉排序树在生成的过程中,树的形态比较匀称,最终得到的是一棵形态与二分查找的判定树相似的二叉排序树,此时它的平均查找长度大约是lgn。插入、删除和查找算法的时间复杂度均为O(lgn)。1.2.5 平衡二叉树( AVL树 ) 平衡二叉树(Balanced Binary Tree)是指树中任一结点的左右子树的高度大致相同。 任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完

10、全平衡的。通常,只要二叉树的高度为O(1gn),就可看作是平衡的。 平衡的二叉排序树指满足BST性质的平衡二叉树。 AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。在最坏情况下,n个结点的AVL树的高度约为1.44lgn。而完全平衡的二叉树高度约为lgn,AVL树是最接近最优的。1.2.6 平衡因子 二叉树上任一结点的左子树深度减去右子树的深度称为该结点的平衡因子,易知平衡二叉树中所有结点的因子只可能为0,-1和1。平衡二叉排序树的在平衡因子绝对值等于2时开始调整到绝对值为1或0,在平衡因子绝对值为2时,二叉排序树会出现四种不同的情况的树形,因此这时需要分别单独讨论来降低平衡因子。1

11、.2.7 平衡二叉树的调整方法平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤如下:(1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点;(2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;(3)判断新插入的结点与最

12、小不平衡子树的根结点的关系,确定是哪种类型的调整;(4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;(5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。2 方案设计2.1 模块功能1.建立二叉树:要求以回车()为输入结束标志,输入数列L,生成一棵二叉排序树T。

13、2.中序遍历并输出结果:要求将第一步建立的二叉树进行中序遍历,并将结果输出。 3.平均查找长度并输出:要求计算二叉排序树T查找成功的平均查找长度,输出结果。 4.删除节点:要求输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 5.生成平衡二叉树:要求用数列L,生成平衡的二叉排序树BT: 6.平均查找长度:计算平衡的二叉排序树BT的平均查找长度,输出结果。3 算法设计3.1 算法流程图 建立二叉树流程图: YES NO 主程序流程图:中序遍历流程图: 删除节点流程图:4 详细设计4.1 主程序void main() node T=NU

14、LL; int num; int s=0,j=0,i=0; int ch=0; node p=NULL; printf(请输入一组数字并输入0为结束符:); do scanf(%d,&num); if(!num) printf(你成功完成了输入!n else insertBST(&T,num); while(num);nn-操作菜单-nn 0: 退出 );n 1: 中序遍历n 2: 平均查找长度printf(n 3: 删除n 4: 判断是否是平衡二叉树while(ch=ch) n 选择操作并继续:ch); switch(ch) case 0: exit(0); /*0退出*/ case 1:

15、中序遍历结果是:n inorderTraverse(&T); break; case 2: s=0;j=0;i=0; calculateASL(&T,&s,&j,i); ASL=%d/%d,s,j); case 3: 请输入你想删除的数字: if(searchBST(T,num,NULL,&p) T=Delete(T,num); 你已成功删除该数字! else printf( 没有你想要删除的节点 %d!,num); case 4: i=0; balanceBST(T,&i); if(i=0) printf( OK!这是平衡二叉树! NO! default:你的输入有误!请重新输入! 4.2

16、定义二叉树结构 #includetypedef struct Tnode int data; struct Tnode *lchild,*rchild;*node,BSTnode;4.3 建立二叉树4.3.1 二叉排序树的查找searchBST(node t,int key,node f,node *p) /*在根指针t所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功,则指针p指向该数据元素节点,并返回(1),否则指针p指向查找路径上访问的最后一个节点并返回(0),指针f指向t的双亲,其初始调用值为NULL*/if(!t) *p=f;return (0); /*查找不成功*/

17、else if(key=t-data) *p=t;return (1); /*查找成功*/else if(keydata) searchBST(t-lchild,key,t,p); /*在左子树中继续查找*/else searchBST(t-rchild,key,t,p); /*在右子树中继续查找*/4.3.2 二叉排序树的插入insertBST(node *t,int key) /*当二叉排序树t中不存在关键字等于key的数据元素时,插入key并返回(1),否则返回(0)*/node p=NULL,s=NULL;searchBST(*t,key,NULL,&p) /*查找不成功 */ s=(

18、node)malloc(sizeof(BSTnode); s-data=key;lchild=s-rchild=NULL;p) *t=s; /*被插入节点*s为新的根节点*/ else if(keydata) p-lchild=s; /*被插节点*s为左孩子*/ else p-rchild=s; /*被插节点*s为右孩子*/ return (1);else return (0); /*树中已有关键字相同的节点,不再插入*/4.4 中序遍历inorderTraverse(node *t) /*中序遍历*/ if(*t)if(inorderTraverse(&(*t)-lchild) printf

19、(%d ,(*t)-data); if(inorderTraverse(&rchild); else return(1);4.5 平均查找长度calculateASL(node *t,int *s,int *j,int i) /*计算平均查找长度*/if(*t) i+; *s=*s+i; if(calculateASL(&lchild,s,j,i) (*j)+;rchild,s,j,i) i-; return(1); 4.6 删除节点node Delete(node t,int key) /*若二叉排序树t中存在关键字等于key的数据元素时,则删除该数据元素节点*/ node p=t,q=NU

20、LL,s,f; while(p!=NULL) if(p-data=key) break; q=p; if(p-datakey) p=p-lchild; else p=p-rchild; if(p=NULL) return t;lchild=NULL) if(q=NULL) t=p- else if(q-lchild=p) q-lchild=p- else q-rchild=p- free(p); else f=p; s=p- while(s-rchild) f=s; s=s- if(f=p) f- else f-rchild=s- p-data=s-data; free (s); return

21、 t;4.7 判断平衡二叉树int balanceBST(node t,int *i) /*判断平衡二叉树*/ int dep1,dep2;t) return(0); else dep1=balanceBST(t-lchild,i); dep2=balanceBST(t-rchild,i);if(dep1-dep2)1|(dep1-dep2)dep2) return(dep1+1); else return(dep2+1);5 调试分析5.1 时间复杂度的分析为了保证二叉排序树的高度为lgn,从而保证然二叉排序树上实现的插入、删除和查找等基本操作的时间复杂度为O(lgn)。5.2 运行结果图5

22、.1.1 调试界面在程序调试过程当中,编译时并没有报错,但是运行时总是出错,在查阅资料和同学的帮助下,发现程序未对数组初始化。添加数组初始化代码:s=(node)malloc(sizeof(BSTnode)输入一组数列,以结0结束:图5.2.2运行界面一中序遍历:图5.2.3运行界面二计算平均查找长度图5.2.4运行界面三删除已有结点:图5.2.5运行界面四删除失败:图5.2.6运行界面五判断是否是平衡二叉树:图5.2.7运行界面六5.3 结果分析 通过运行程序和严密的求证,运行结果无误,不过对于转换平衡二叉树和平衡二叉树平均查找长度未能实现,同时也无法实现图像显示。6 课程设计总结在这一周的课程设计中,其实对我来说还是收获颇多。这不光提高了我

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

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