




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 课程设计报告课程名称数据结构课程设计题目指导教师设计起止日学院计算机学院专业软件工程学生姓名班级学号成绩一需求分析1、建立平衡二叉树并进行创建、增加、删除、调平等操作。2、设计一个实现平衡二叉树的程序,可进行创建、增加、删除、调平等操作,实现动态的输入数据,实时的输出该树结构。3、测试数据:自选数据二概要设计平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤如下:每当插入一个新结点
2、,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点;若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整;如果是型或型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是型或型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;计算调整后的
3、平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。三详细设计树的内部变量typedefstructBTNodeintdata;intbf;/平衡因子structBTNode*lchild,*rchild;/左、右孩子BTNode,*BTree;调平二叉树(左右调平方式大体雷同,之具体写出其中一种调平方式TOC o 1-5 h zif(插入元素与当前根元素相等)printf(已存在相同关键字的结点n);if(插入元素小于当前根元素)if(插入新结点不成功)return0;if(插入成功)switch(查看根的平衡因子)c
4、ase+1:进行左平衡处理;检查*T的左子树的平衡度,并作相应平衡处理case+1:TOC o 1-5 h z令根及其左孩子的平衡因子为0;做右平衡处理;BTreelc;lc指向的结点左子树根结点;rc的右子树挂接为结点的左子树;lc的右孩子为原结点;原结点指向新的结点lc;break;case-1:rd指向*T的左孩子的右子树根TOC o 1-5 h zswitch(查看右孩子平衡因子)case+1:根的平衡因子为-1;根左孩子的平衡因子为0;break;case0:令根和根左孩子的平衡因子为0;break;case-1:1;根平衡因子为0;根左孩子平衡因子为break;根右孩子的平衡因子为
5、0;TOC o 1-5 h z对*T的左子树作左旋平衡处理;对*TD右旋平衡处理;break;case0:令根的平衡因子为+1;break;case-1:令根的平衡因子为-1;break;四调试分析在进行对插入新结点并调平时由于利用的是普通的插入方法进行、型的转换,使得在调试时经常没有更改内部变量的值,导致编译出错。对于在空树情况下删除结点的考虑,是在后期的调试检验过程中发现的。在没有更改代码前,如果按此操作,程序就会崩溃。原因就是在删除函数中虽然考虑到了空树的情况,但是在输出树的函数中没有加入空树的考虑而只是在创建树函数中加入了的判断。经过反复的检查,发现可以直接在输出函数中加入判断而不必再
6、其他位置判断,并且调试成功。五使用说明和测试结果测试数据:创建二叉树 #ffli量.ufpi矗C-兰MF?旦-TT-i1e.咱liWf.I:|T11洋中!I忠I!壬丄因)片sIllrmJII.1.1.rchild;/rc的右子树挂接为*pOOODlc-rchild=p;p=lc;/p指向新的结点/*对以*pD根的二叉排序树作左旋处理*/voidLeft_Balance(BTree&p)BTreerc;rc=p-rchild;/指向的*p右子树根结点p-rchild=rc-lchild;/rc左子树挂接到*pOOODrc-lchild=p;p=rc;/p指向新的结点 #/*对以指针T所指结点为根
7、的二叉树作左平衡旋转处理*/&T)voidLeft_Root_Balance(BTreeBTreelc,rd;lc=T-lchild;switch(lc-bf)caseLH:T-bf=lc-bf=EH;Right_Balance(T);break;caseRH:rd=lc-rchild;switch(rd-bf)caseLH:T-bf=RH;lc-bf=EH;break;caseEH:T-bf=lc-bf=EH;break;caseRH:T-bf=EH;lc-bf=LH;break;rd-bf=EH;Left_Balance(T-lchild);Right_Balance(T);/*对以指针T
8、所指结点为根的二叉树作右平衡旋转处理voidRight_Root_Balance(BTree&T)/指向*TD左子树根结点/检查*T的左子树的平衡度,并作相应平衡处理/新结点插入在*T的左孩子的左子树上,要作单右旋处理/新结点插入在*T的左孩子的右子树上,要作双旋处理/rd指向*T的左孩子的右子树根/修改*叮其左孩子的平衡因子/对*T的左子树作左旋平衡处理/对*TD右旋平衡处理*/BTreerc,ld;rc=T-rchild;/指向*TD左子树根结点switch(rc-bf)/检查*T的右子树的平衡度,并作相应平衡处理caseRH:/新结点插入在*T的右孩子的右子树上,要作单左旋处理T-bf=
9、rc-bf=EH;Left_Balance(T);break;caseLH:/新结点插入在*T的右孩子的左子树上,要作双旋处理ld=rc-lchild;/ld指向*T的右孩子的左子树根switch(ld-bf)/修改*TD其右孩子的平衡因子 #caseLH:T-bf=EH;rc-bf=RH;break;caseEH:T-bf=rc-bf=EH;break;caseRH:T-bf=LH;rc-bf=EH;break;ld-bf=EH;Right_Balance(T-rchild);/对*T的右子树作左旋平衡处理Left_Balance(T);/对*TD左旋平衡处理/*插入结点i,若T中存在和i相
10、同关键字的结点,则插入一个数据元素为boolInsertAVL(BTree&T,inti,bool&taller)if(!T)/插入新结点,树长高,置taller为truei的新结点,并返回叮否则返叮*/T=(BTree)malloc(sizeof(BTNode);T-data=i;T-lchild=T-rchild=NULL;T-bf=EH;taller=true;elseif(EQ(i,T-data)taller=false;printf(已存在相同关键字的结点return0;if(LT(i,T-data)/树中已存在和有相同关键字的结点n);/应继续在*T的左子树中进行搜索if(!Ins
11、ertAVL(T-lchild,i,taller)return0;else/应继续在*T的右子树中进行搜索if(!InsertAVL(T-rchild,i,taller)return0; # #return1;/*按树状打印输出二叉树的元素,m表示结点所在层次*/voidPrintBT(BTreeT,intm)if(T)inti;if(T-rchild)PrintBT(T-rchild,m+1);for(i=1;ilchild)PrintBT(T-lchild,m+1);elseprintf(这是一棵空树!n);getchar();/*创建二叉树,以输入-32767为建立的结束*/voidCr
12、eatBT(BTree&T)intm;inti;booltaller=false;T=NULL;printf(n请输入关键字(以-32767结束建立二叉树):);scanf(%i,&i);getchar();while(i!=-32767)InsertAVL(T,i,taller);printf(n请输入关键字(以-32767结束建立二叉树):);scanf(%i,&i);getchar();taller=false;m=0;printf(您创建的二叉树为:n);PrintBT(T,m); #/*删除结点时左平衡旋转处理*/voidLeft_Root_Balance_det(BTree&p,i
13、nt&shorter)BTreep1,p2;if(p-bf=l)/p结点的左子树高,删除结点后p的bf减,树变矮p-bf=0;shorter=1;elseif(p-bf=O)/p结点左、右子树等高,删除结点后p-bf=-1;shorter=0;else/p结点的右子树高pl=p-rchild;/pl指向p的右子树if(pl-bf=O)/pl结点左、右子树等高,删除结点后Left_Balance(p);p1-bf=1;p-bf=-1;shorter=0;elseif(pl-bf=T)/pl的右子树高,左旋处理后,树变矮Left_Balance(p);p1-bf=p-bf=0;shorter=1;
14、else/pl的左子树高,进行双旋处理(先右旋后左旋p的bf减,树高不变p的bf为一2,进行左旋处理,树高不变),树变矮p2=pl-lchild;pl-lchild=p2-rchild;p2-rchild=pl;p-rchild=p2-lchild;p2-lchild=p;if(p2-bf=0)p-bf=0;pl-bf=0;elseif(p2-bf=-l)p-bf=l;pl-bf=0; #elsep-bf=0;p1-bf=-1;p2-bf=0;p=p2;shorter=1;/*/voidRight_Root_Balance_det(BTree&p,int&shorter)BTreep1,p2;
15、if(p-bf=-1)p-bf=0;shorter=1;elseif(p-bf=0)p-bf=1;shorter=0;elsep1=p-lchild;if(p1-bf=0)Right_Balance(p);p1-bf=-1;p-bf=1;shorter=0;elseif(p1-bf=1)Right_Balance(p);p1-bf=p-bf=0;shorter=1;elsep2=p1-rchild;p1-rchild=p2-lchild;p2-lchild=p1;p-lchild=p2-rchild;p2-rchild=p;if(p2-bf=0)p-bf=0;p1-bf=0;elseif(p2
16、-bf=1)p-bf=-1;p1-bf=0;elsep-bf=0;p1-bf=1;p2-bf=0;p=p2;shorter=1;/*删除结点*/voidDelete(BTreeq,BTree&r,int&shorter)if(r-rchild=NULL)q-data=r-data;q=r;r=r-lchild;free(q);shorter=1;elseDelete(q,r-rchild,shorter);if(shorter=1)Right_Root_Balance_det(r,shorter);/*二叉树的删除操作*/intDeleteAVL(BTree&p,intx,int&shorte
17、r)intk;BTreeq;if(p=NULL)printf(不存在要删除的关键字!n);return0;elseif(xp-data)/在p的左子树中进行删除k=DeleteAVL(p-lchild,x,shorter);if(shorter=1)Left_Root_Balance_det(p,shorter);returnk;elseif(xp-data)/在p的右子树中进行删除k=DeleteAVL(p-rchild,x,shorter);if(shorter=1)Right_Root_Balance_det(p,shorter);returnk;elseq=p;if(p-rchild=
18、NULL)/右子树空则只需重接它的左子树p=p-lchild;free(q);shorter=1;elseif(p-lchild=NULL)/左子树空则只需重接它的右子树p=p-rchild;free(q);shorter=1;else/左右子树均不空Delete(q,q-lchild,shorter);if(shorter=1)Left_Root_Balance_det(p,shorter);p=q;return1; # # /*二叉树调平操作*/voidAdj_balance(BTree&T)intm;inti;booltaller=false;T=NULL;printf(n请输入关键字(
19、以-32767结束建立平衡二叉树):);scanf(%d,&i);getchar();while(i!=-32767)SetAVL(T,i,taller);printf(n请输入关键字scanf(%d,&i);getchar();taller=false;m=0;printf(平衡二叉树创建结束if(T)PrintBT(T,m);else(以-32767结束建立平衡二叉树.n);):); # #printf(这是一棵空树.n);/*调平二叉树具体方法*/boolSetAVL(BTree&T,inti,bool&taller)长高,置taller为trueT=(BTree)malloc(sizeof(BTNode);T-data=i;T-lchild=T-rchild=NULL;T-bf=EH;taller=true;else/树中已存在和有相同关键字的结点n);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025“阴阳合同”的处理原则
- 2025翡翠首饰买卖合同模板
- 2025国际石油工程建设项目合同(中英文对照)
- 2025食品采购合同
- 2025关于软件升级的服务合同范本
- 2025实习生合同协议书
- 2025保险公司担保合同样本2
- 2025年商业地产租赁合同
- 2025年增亮膜项目合作计划书
- 2025年地质勘查专用设备项目建议书
- 期中模拟卷(新疆专用)-2024-2025学年八年级英语下学期核心素养素质调研模拟练习试题(考试版)A4
- 甲状旁腺切除术后的护理措施
- 2024慢性鼻窦炎诊断和治疗指南解读课件
- (T8联考)2025届高三部分重点中学3月联合测评生物试卷(含答案详解)河北版
- 员工入职申请表(完整版)
- T-GDEIIA 56-2024 垂直起降低空航空器起降场基础设施配置技术要求
- 整本书阅读《林海雪原》【知识精研】六年级语文下册 (统编版五四制2024)
- 9《我的战友邱少云》说课稿-2024-2025学年六年级语文上册统编版
- 亚朵酒店前台培训
- 大学假期安全主题班会课件
- 创业培训讲师手册
评论
0/150
提交评论