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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构 平衡二叉树的操作演示.docx

1、数据结构 平衡二叉树的操作演示平衡二叉树操作的演示1. 需求分析本程序是利用平衡二叉树,实现动态查找表的基本功能:创建表,查找、插入、删除。具体功能:(1) 初始,平衡二叉树为空树,操作界面给出创建、查找、插入、删除、合并、分裂六种操作供选择。每种操作均提示输入关键字。每次插入或删除一个结点后,更新平衡二叉树的显示。(2) 平衡二叉树的显示采用凹入表现形式。 (3) 合并两棵平衡二叉树。 (4) 把一棵二叉树分裂为两棵平衡二叉树,使得在一棵树中的所有关键字都小于或等于x,另一棵树中的任一关键字都大于x。如下图:2概要设计平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因

2、插入新结点而破坏了二叉排序树的平衡性,若是则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤:(1) 每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值不超过1,则平衡二叉树没有失去平衡,继续插入结点;(2) 若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;(3) 判断新插入的结点与最小不平衡子树的根结点个关系,确定是那种类型的调整;(4) 如果是LL型或RR型,只需应用扁担原理旋转一次,

3、在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或RL型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;(5) 计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后平衡二叉树中是否存在平衡因子大于1的结点。流程图3. 详细设计二叉树类型定义:typedef int Status;typedef int ElemType;typedef struct BSTNode ElemType data; int bf; str

4、uct BSTNode *lchild ,*rchild; BSTNode,* BSTree;Status SearchBST(BSTree T,ElemType e)/查找void R_Rotate(BSTree &p)/右旋void L_Rotate(BSTree &p)/左旋void LeftBalance(BSTree &T)/插入平衡调整void RightBalance(BSTree &T)/插入平衡调整Status InsertAVL(BSTree &T,ElemType e,int &taller)/插入void DELeftBalance(BSTree &T)/删除平衡调整v

5、oid DERightBalance(BSTree &T)/删除平衡调整Status Delete(BSTree &T,int &shorter)/删除操作Status DeleteAVL(BSTree &T,ElemType e,int &shorter)/删除操作void merge(BSTree &T1,BSTree &T2)/合并操作void splitBSTree(BSTree T,ElemType e,BSTree &T1,BSTree &T2)/分裂操作void PrintBSTree(BSTree &T,int lev)/凹入表显示附录源代码:#include#include/

6、#define TRUE 1/#define FALSE 0/#define OK 1/#define ERROR 0#define LH +1#define EH 0#define RH -1/二叉类型树的类型定义typedef int Status;typedef int ElemType;typedef struct BSTNodeElemType data;int bf;/结点的平衡因子struct BSTNode *lchild ,*rchild;/左、右孩子指针 BSTNode,* BSTree;/*查找算法*/Status SearchBST(BSTree T,ElemType

7、e)if(!T)return 0; /查找失败else if(e = T-data )return 1; /查找成功else if (e data)return SearchBST(T-lchild,e);elsereturn SearchBST(T-rchild,e);/右旋void R_Rotate(BSTree &p)BSTree lc; /处理之前的左子树根结点lc = p-lchild; /lc指向的*p的左子树根结点p-lchild = lc-rchild; /lc的右子树挂接为*P的左子树lc-rchild = p;p = lc; /p指向新的根结点/左旋void L_Rotat

8、e(BSTree &p)BSTree rc;rc = p-rchild; /rc指向的*p的右子树根结点p-rchild = rc-lchild; /rc的左子树挂接为*p的右子树rc-lchild = p;p = rc; /p指向新的根结点/对以指针T所指结点为根结点的二叉树作左平衡旋转处理,/本算法结束时指针T指向新的根结点void LeftBalance(BSTree &T)BSTree lc,rd;lc=T-lchild;/lc指向*T的左子树根结点switch(lc-bf) /检查*T的左子树的平衡度,并做相应的平衡处理case LH: /新结点插入在*T的左孩子的左子树,要做单右旋

9、处理T-bf = lc-bf=EH;R_Rotate(T);break;case RH: /新结点插入在*T的左孩子的右子树上,做双旋处理rd=lc-rchild; /rd指向*T的左孩子的右子树根switch(rd-bf) /修改*T及其左孩子的平衡因子case LH: T-bf=RH; lc-bf=EH;break;case EH: T-bf=lc-bf=EH;break;case RH: T-bf=EH; lc-bf=LH;break;rd-bf=EH;L_Rotate(T-lchild); /对*T的左子树作左旋平衡处理R_Rotate(T); /对*T作右旋平衡处理/右平衡旋转处理v

10、oid RightBalance(BSTree &T)BSTree rc,ld;rc=T-rchild;switch(rc-bf)case RH:T-bf= rc-bf=EH;L_Rotate(T);break;case LH:ld=rc-lchild;switch(ld-bf)case LH: T-bf=RH; rc-bf=EH;break;case EH: T-bf=rc-bf=EH;break;case RH: T-bf = EH; rc-bf=LH;break;ld-bf=EH;R_Rotate(T-rchild);L_Rotate(T);/插入结点Status InsertAVL(B

11、STree &T,ElemType e,int &taller)/taller反应T长高与否if(!T)/插入新结点,树长高,置taller为trueT= (BSTree) malloc (sizeof(BSTNode);T-data = e;T-lchild = T-rchild = NULL;T-bf = EH;taller = 1;elseif(e = T-data)taller = 0;return 0;if(e data)if(!InsertAVL(T-lchild,e,taller)/未插入return 0;if(taller)/已插入到*T的左子树中且左子树长高switch(T-

12、bf)/检查*T的平衡度,作相应的平衡处理case LH:LeftBalance(T);taller = 0;break;case EH:T-bf = LH;taller = 1;break;case RH:T-bf = EH;taller = 0;break;elseif (!InsertAVL(T-rchild,e,taller)return 0;if(taller)/插入到*T的右子树且右子树增高switch(T-bf)/检查*T的平衡度case LH:T-bf = EH;taller = 0;break;case EH:T-bf = RH;taller = 1;break;case R

13、H:RightBalance(T);taller = 0;break;return 1;void DELeftBalance(BSTree &T)/删除平衡调整BSTree lc,rd;lc=T-lchild;switch(lc-bf)case LH:T-bf = EH;/lc-bf= EH;R_Rotate(T);break;case EH:T-bf = EH;lc-bf= EH;R_Rotate(T);break;case RH:rd=lc-rchild;switch(rd-bf)case LH: T-bf=RH; lc-bf=EH;break;case EH: T-bf=lc-bf=EH

14、;break;case RH: T-bf=EH; lc-bf=LH;break;rd-bf=EH;L_Rotate(T-lchild);R_Rotate(T);void DERightBalance(BSTree &T) /删除平衡调整BSTree rc,ld;rc=T-rchild;switch(rc-bf)case RH:T-bf= EH;/rc-bf= EH;L_Rotate(T);break;case EH:T-bf= EH;/rc-bf= EH;L_Rotate(T);break;case LH:ld=rc-lchild;switch(ld-bf)case LH: T-bf=RH;

15、rc-bf=EH;break;case EH: T-bf=rc-bf=EH;break;case RH: T-bf = EH; rc-bf=LH;break;ld-bf=EH;R_Rotate(T-rchild);L_Rotate(T);void SDelete(BSTree &T,BSTree &q,BSTree &s,int &shorter)if(s-rchild)SDelete(T,s,s-rchild,shorter);if(shorter)switch(s-bf)case EH:s-bf = LH;shorter = 0;break;case RH:s-bf = EH;shorte

16、r = 1;break;case LH:DELeftBalance(s);shorter = 0;break;return;T-data = s-data;if(q != T)q-rchild = s-lchild;elseq-lchild = s-lchild;shorter = 1;/删除结点Status Delete(BSTree &T,int &shorter)BSTree q;if(!T-rchild)q = T;T = T-lchild;free(q);shorter = 1;else if(!T-lchild)q = T;T= T-rchild;free(q);shorter =

17、 1;elseSDelete(T,T,T-lchild,shorter);if(shorter)switch(T-bf)case EH:T-bf = RH;shorter = 0;break;case LH:T-bf = EH;shorter = 1;break;case RH:DERightBalance(T);shorter = 0;break;return 1;Status DeleteAVL(BSTree &T,ElemType e,int &shorter)int sign = 0;if (!T)return sign;elseif(e = T-data)sign = Delete(

18、T,shorter);return sign;else if(e data)sign = DeleteAVL(T-lchild,e,shorter);if(shorter)switch(T-bf)case EH:T-bf = RH;shorter = 0;break;case LH:T-bf = EH;shorter = 1;break;case RH:DERightBalance(T);shorter = 0;break;return sign;elsesign = DeleteAVL(T-rchild,e,shorter);if(shorter)switch(T-bf)case EH:T-

19、bf = LH;shorter = 0;break;case RH:T-bf = EH;break;case LH:DELeftBalance(T);shorter = 0;break;return sign;/合并void merge(BSTree &T1,BSTree &T2)int taller = 0;if(!T2)return;merge(T1,T2-lchild);InsertAVL(T1,T2-data,taller);merge(T1,T2-rchild);/分裂void split(BSTree T,ElemType e,BSTree &T1,BSTree &T2)int t

20、aller = 0;if(!T)return;split(T-lchild,e,T1,T2);if(T-data e)InsertAVL(T2,T-data,taller);elseInsertAVL(T1,T-data,taller);split(T-rchild,e,T1,T2);/分裂void splitBSTree(BSTree T,ElemType e,BSTree &T1,BSTree &T2)BSTree t1 = NULL,t2 = NULL;split(T,e,t1,t2);T1 = t1;T2 = t2;return;/构建void CreatBSTree(BSTree &

21、T)int num,i,e,taller = 0;printf(输入结点个数:);scanf(%d,&num);printf(请顺序输入结点值n);for(i = 0 ;i rchild)PrintBSTree(T-rchild,lev+1);for(i = 0;i data);if(T-lchild)PrintBSTree(T-lchild,lev+1);void Start(BSTree &T1,BSTree &T2)int cho,taller,e,k;taller = 0;k = 0;while(1)system(cls);printf( 平衡二叉树操作的演示 nn);printf(*

22、n);printf( 平衡二叉树显示区 n);printf(T1树n);if(!T1 )printf(n 当前为空树n);elsePrintBSTree(T1,1);printf(T2树n);if(!T2 )printf(n 当前为空树n);elsePrintBSTree(T2,1);printf(n*n);printf(T1操作:1.创建 2.插入 3.查找 4.删除 10.分裂n);printf(T2操作:5.创建 6.插入 7.查找 8.删除 11.分裂n);printf( 9.合并 T1,T2 0.退出n);printf(*n);printf(输入你要进行的操作:);scanf(%d,

23、&cho);switch(cho)case 1:CreatBSTree(T1);break;case 2:printf(请输入要插入关键字的值);scanf(%d,&e);InsertAVL(T1,e,taller) ;break;case 3:printf(请输入要查找关键字的值);scanf(%d,&e);if(SearchBST(T1,e)printf(查找成功!n);elseprintf(查找失败!n);printf(按任意键返回87);getchar();getchar();break;case 4:printf(请输入要删除关键字的值);scanf(%d,&e);if(Delete

24、AVL(T1,e,k)printf(删除成功!n);elseprintf(删除失败!n);printf(按任意键返回);getchar();getchar();break;case 5:CreatBSTree(T2);break;case 6:printf(请输入要插入关键字的值);scanf(%d,&e);InsertAVL(T2,e,taller) ;break;case 7:printf(请输入要查找关键字的值);scanf(%d,&e);if(SearchBST(T2,e)printf(查找成功!n);elseprintf(查找失败!n);printf(按任意键返回);getchar(

25、);getchar();break;case 8:printf(请输入要删除关键字的值);scanf(%d,&e);if(DeleteAVL(T2,e,k)printf(删除成功!n);elseprintf(删除失败!n);printf(按任意键返回);getchar();getchar();break;case 9:merge(T1,T2);T2 = NULL;printf(合并成功,按任意键返回);getchar();getchar();break;case 10:printf(请输入要中间值字的值);scanf(%d,&e);splitBSTree(T1,e,T1,T2) ;printf(分裂成功,按任意键返回);getchar();getchar();break;case 11:printf(请输入要中间值字的值);scanf(%d,&e);splitBSTree(T2,e,T1,T2) ;printf(分裂成功,按任意键返回);getchar();getchar();break;case 0:system(cls);exit(0);main()BSTree T1 = NULL;BSTree T2 = NULL;Start(T1,T2);

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

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