您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 数据结构-平衡二叉树的操作演示
平衡二叉树操作的演示1.需求分析本程序是利用平衡二叉树,实现动态查找表的基本功能:创建表,查找、插入、删除。具体功能:(1)初始,平衡二叉树为空树,操作界面给出创建、查找、插入、删除、合并、分裂六种操作供选择。每种操作均提示输入关键字。每次插入或删除一个结点后,更新平衡二叉树的显示。(2)平衡二叉树的显示采用凹入表现形式。(3)合并两棵平衡二叉树。(4)把一棵二叉树分裂为两棵平衡二叉树,使得在一棵树中的所有关键字都小于或等于x,另一棵树中的任一关键字都大于x。如下图:2.概要设计平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤:(1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值不超过1,则平衡二叉树没有失去平衡,继续插入结点;(2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;(3)判断新插入的结点与最小不平衡子树的根结点个关系,确定是那种类型的调整;(4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或RL型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;(5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后平衡二叉树中是否存在平衡因子大于1的结点。流程图3.详细设计二叉树类型定义:typedefintStatus;typedefintElemType;typedefstructBSTNode{ElemTypedata;intbf;structBSTNode*lchild,*rchild;}BSTNode,*BSTree;StatusSearchBST(BSTreeT,ElemTypee)//查找voidR_Rotate(BSTree&p)//右旋voidL_Rotate(BSTree&p)//左旋voidLeftBalance(BSTree&T)//插入平衡调整voidRightBalance(BSTree&T)//插入平衡调整StatusInsertAVL(BSTree&T,ElemTypee,int&taller)//插入voidDELeftBalance(BSTree&T)//删除平衡调整voidDERightBalance(BSTree&T)//删除平衡调整StatusDelete(BSTree&T,int&shorter)//删除操作StatusDeleteAVL(BSTree&T,ElemTypee,int&shorter)//删除操作voidmerge(BSTree&T1,BSTree&T2)//合并操作voidsplitBSTree(BSTreeT,ElemTypee,BSTree&T1,BSTree&T2)//分裂操作voidPrintBSTree(BSTree&T,intlev)//凹入表显示附录源代码:#includestdio.h#includestdlib.h//#defineTRUE1//#defineFALSE0//#defineOK1//#defineERROR0#defineLH+1#defineEH0#defineRH-1//二叉类型树的类型定义typedefintStatus;typedefintElemType;typedefstructBSTNode{ElemTypedata;intbf;//结点的平衡因子structBSTNode*lchild,*rchild;//左、右孩子指针}BSTNode,*BSTree;/*查找算法*/StatusSearchBST(BSTreeT,ElemTypee){if(!T){return0;//查找失败}elseif(e==T-data){return1;//查找成功}elseif(eT-data){returnSearchBST(T-lchild,e);}else{returnSearchBST(T-rchild,e);}}//右旋voidR_Rotate(BSTree&p){BSTreelc;//处理之前的左子树根结点lc=p-lchild;//lc指向的*p的左子树根结点p-lchild=lc-rchild;//lc的右子树挂接为*P的左子树lc-rchild=p;p=lc;//p指向新的根结点}//左旋voidL_Rotate(BSTree&p){BSTreerc;rc=p-rchild;//rc指向的*p的右子树根结点p-rchild=rc-lchild;//rc的左子树挂接为*p的右子树rc-lchild=p;p=rc;//p指向新的根结点}//对以指针T所指结点为根结点的二叉树作左平衡旋转处理,//本算法结束时指针T指向新的根结点voidLeftBalance(BSTree&T){BSTreelc,rd;lc=T-lchild;//lc指向*T的左子树根结点switch(lc-bf){//检查*T的左子树的平衡度,并做相应的平衡处理caseLH://新结点插入在*T的左孩子的左子树,要做单右旋处理T-bf=lc-bf=EH;R_Rotate(T);break;caseRH://新结点插入在*T的左孩子的右子树上,做双旋处理rd=lc-rchild;//rd指向*T的左孩子的右子树根switch(rd-bf){//修改*T及其左孩子的平衡因子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;L_Rotate(T-lchild);//对*T的左子树作左旋平衡处理R_Rotate(T);//对*T作右旋平衡处理}}//右平衡旋转处理voidRightBalance(BSTree&T){BSTreerc,ld;rc=T-rchild;switch(rc-bf){caseRH:T-bf=rc-bf=EH;L_Rotate(T);break;caseLH:ld=rc-lchild;switch(ld-bf){caseLH:T-bf=RH;rc-bf=EH;break;caseEH:T-bf=rc-bf=EH;break;caseRH:T-bf=EH;rc-bf=LH;break;}ld-bf=EH;R_Rotate(T-rchild);L_Rotate(T);}}//插入结点StatusInsertAVL(BSTree&T,ElemTypee,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;}else{if(e==T-data){taller=0;return0;}if(eT-data){if(!InsertAVL(T-lchild,e,taller))//未插入return0;if(taller)//已插入到*T的左子树中且左子树长高switch(T-bf){//检查*T的平衡度,作相应的平衡处理caseLH:LeftBalance(T);taller=0;break;caseEH:T-bf=LH;taller=1;break;caseRH:T-bf=EH;taller=0;break;}}else{if(!InsertAVL(T-rchild,e,taller)){return0;}if(taller)//插入到*T的右子树且右子树增高switch(T-bf){//检查*T的平衡度caseLH:T-bf=EH;taller=0;break;caseEH:T-bf=RH;taller=1;break;caseRH:RightBalance(T);taller=0;break;}}}return1;}voidDELeftBalance(BSTree&T){//删除平衡调整BSTreelc,rd;lc=T-lchild;switch(lc-bf){caseLH:T-bf=EH;//lc-bf=EH;R_Rotate(T);break;caseEH:T-bf=EH;lc-bf=EH;R_Rotate(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;L_Rotate(T-lchild);R_Rotate(T);}}voidDERightBalance(BSTree&T)//删除平衡调整{BSTreerc,ld;rc=T-rchild;switch(rc-bf){caseRH:T-bf=EH;//rc-bf=EH;L_Rotate(T);break;caseEH:T-bf=EH;//rc-bf=EH;L_Rotate(T);break;caseLH:ld=rc-lchild;switch(ld-bf){caseLH:T-bf=RH;rc-bf=EH;break;caseEH:T-bf=rc-bf=EH;break;caseRH:T-bf=EH;rc-bf=LH;break;}ld-bf=EH;R_Rotate(T-rchild);L_Rotate(T);}}voidSDelete(BSTree&T,BSTree&q,BSTree&s,int&shorter){if(s-rchild){SDelete(T,s,s-rchild,shorter);if(shorter)switch(s-bf){caseEH:s-bf=LH;shorter=0;break;caseRH:s-bf=EH;shorter=1;break;caseLH:DELeftBalance(s);shorter=0;break;}return;}T-data=s-data;if(q!=T)q-rchild=s-lchild;elseq-lchild=s-lchild;shorter=1;}//删除结点StatusDelete(BSTree&T,int&shorter){BSTreeq;if(!T-rchild){q=T;T=T-lchild;free(q);shorter=1;}elseif(!T-lchild){q=T;T=T-rchild;free(q);shorter=1;}else{SDelete(T,T,T-lchild,shorter);if(shorter)switch(T-bf){caseEH:T-bf=RH;shorter=0;break;caseLH:T-bf=EH;shorter=1;break;caseRH:DERightBalance(T);shorter=0;break;}}return1;}StatusDeleteAVL(BSTree&T,ElemTypee,int&shorter){intsign=0;if(!T){returnsign;}else{if(e==T-
本文标题:数据结构-平衡二叉树的操作演示
链接地址:https://www.777doc.com/doc-1991481 .html