平衡树

来源:互联网 发布:网络的坏处有哪些 编辑:程序博客网 时间:2024/04/28 21:38
#include<iostream>using namespace std ;typedef struct node //树的节点信息{int data ;int bf ;struct node *lchild , *rchild ;}node , *tree ;/*右旋*/void R_Rotate(tree &p){tree lc ;lc = p->lchild ;p->lchild = lc->rchild ;lc->rchild = p ;p = lc;}/*左旋*/void L_Rotate(tree &p){tree rc ;rc = p->rchild ;p->rchild = rc->lchild ;rc->lchild = p ;p = rc ;}/*对以指针T所指的节点根 的二叉树做左旋处理,*/void LeftBalance(tree &T){tree lc ,rd ;lc = T->lchild ;switch(lc->bf){case 1 :T->bf = lc->bf = 0 ;R_Rotate(T); break;case -1 :rd = lc->rchild ;switch(rd->bf ){case 1:T->bf = -1 ;lc->bf = 0 ; break;case 0:T->bf = lc->bf = 0 ;break;case -1:T->bf = 0 ;lc ->bf = 1 ;break;}rd->bf = 0 ;L_Rotate(T->lchild );R_Rotate(T);}}/*对以指针T所指的节点根 的二叉树做右旋处理,*/void RightBalance(tree &T){tree rc ,ld ;rc = T->rchild ;switch(rc->bf){case 1 :T->bf = rc->bf = 0 ;L_Rotate(T); break;case 0 :ld = rc->lchild ;switch(ld->bf ){case 1:T->bf = -1 ;rc->bf = 0 ; break;case 0:T->bf = rc->bf = 0 ;break;case -1:T->bf = 0 ;rc ->bf = 1 ;break;}ld->bf = 0 ;R_Rotate(T->rchild );L_Rotate(T);}}/*如果在平衡树中不存在与e相同的关键词的节点,则插入一个数据元素,为e的新节点,并返回一,否则返回0,如因插入数据而使平衡素失去平衡,则做平衡旋转,布尔变量taller反应T长高与否*/int InsertAVL(tree &T , int e , bool &taller){if(!T) /*插入新节点,树"长高",置taller为true*/{T = (tree)malloc(sizeof(node)); //分配节点if(!T) {cout<<"分配内存失败"<<endl;exit(1);}T->data = e ;T->lchild = T->rchild = NULL ;T->bf = 0 ;taller = true ;}else{if(e == T->data ) //关键词存在,不用插入数据,修改taller变址,直接返回{taller = false ;return 0 ;}if(e < T->data )  //关键词位于左孩子,查找左孩子{if(!InsertAVL(T->lchild , e , taller)) //遍历左孩子,查找是否存存在这个点return 0;if(taller)//已经插入到平衡树中,并且走子树有“长高”switch(T->bf)//检查*T的平衡度{case 1: //原本左子树比右子树高,需要做左平衡处理LeftBalance(T); taller = false ;break;case 0: //原本左,右子树等高,现因左子树增高而使树增高,修改相关标识T->bf = 1 ; taller = true ;break ;case -1: //原本左子树比右子树低,需要做右平衡处理T->bf = 0 ; taller = false ; break;}}else {if(!InsertAVL(T->rchild , e , taller )) //关键词位于右孩子,遍历右孩子return 0;if(taller) //如果树“长高”,判断是何种情况,分别进行操作{switch(T->bf){case 1 : //原来左子树比右子树高,插入右子树,现在左右等高T->bf = 0 ;taller = false ; break;case 0 : //原来左右子树相等,插入到右子树T->bf = -1 ; taller = true ; break;case -1 : //原来左子树比右子树低,插入到右子树,现在右子树高2,进行右旋转,重新达到新的平衡状态RightBalance(T); taller = false ; break;}}}}return 1 ;}/*输出数据*/void outprint(int e){cout<< e ;}/*中序递归遍历整棵树*/void TraTree(tree T){if(T){TraTree(T->lchild ) ;outprint(T->data );TraTree(T->rchild );}return ;}int main(void){tree T = NULL ; //初始化未空树int n ;cout<<"输入要插入的点(输入0时结束):  ";while(cin>>n && n){bool taller ;if(!InsertAVL(T , n , taller ))  //寻找并插入关键词cout<<"关键词已经存在,插入失败"<<endl;/*elsecout<<"关键词不存在,插入成功"<<endl;*/cout<<"输入要插入的点(输入0时结束):  ";}cout<<"中序遍历的结果:"<<endl;TraTree(T); //遍历整棵树cout<<endl;return 0 ;}

原创粉丝点击