平衡二叉树—own版
#include<iostream> using namespace std; const int LH=1; const int RH=-1; const int EH=0; struct BitNode { int data; int bf; BitNode *lchild,*rchild; }; void L_Rotate(BitNode *&p) { BitNode *R=p->rchild; p->rchild=R->lchild; R->lchild=p; p=R; } void R_Rotate(BitNode *&p) { BitNode *L=p->lchild; p->lchild=L->rchild; L->rchild=p; p=L; } void LeftBalance(BitNode *&p) { BitNode *L,*Lr; L=p->lchild; switch(L->bf) { case LH://LL型 p->bf=L->bf=EH; R_Rotate(p); break; case RH://LR型 Lr=L->rchild; switch(Lr->bf) { case LH://左子树右孩子的 左边 p->bf=RH; L->bf=EH; break; case EH: p->bf=L->bf=EH; break; case RH: p->bf=EH; L->bf=LH; break; } Lr->bf=EH; L_Rotate(p->lchild); R_Rotate(p); } } void RightBalance(BitNode *&p)//调整+更新 p 的平衡因子bf { BitNode *R,*RL; R=p->rchild; switch(R->bf) { case RH://RR型 R->bf=p->bf=EH; L_Rotate(p); break; case LH://RL型 RL=R->lchild; switch(RL->bf) { case LH://左子树右孩子的 左边 p->bf=EH; R->bf=RH; break; case EH: p->bf=R->bf=EH; break; case RH: p->bf=LH; R->bf=EH; break; } RL->bf=EH; R_Rotate(p->rchild); L_Rotate(p); } } bool InsertAvl(BitNode *&p,int e,bool &taller) { if(p==NULL) { p=new BitNode(); p->data=e; p->lchild=p->rchild=NULL; p->bf=EH; taller=true; } else { if(e==p->data) { taller=false; return false; } if(e<p->data) { if(!InsertAvl(p->lchild,e,taller)) return false; if(taller) { switch(p->bf) { case LH://插入前P的状态(bf) LeftBalance(p); taller=false; break; case EH: p->bf=LH; taller=true; break; case RH: p->bf=EH; taller=false; break; } } } else { if(!InsertAvl(p->rchild,e,taller)) return false; if(taller) { switch(p->bf) { case LH: p->bf=EH; taller=false; break; case EH: p->bf=RH; taller=true; break; case RH: RightBalance(p); taller=false; break; } } } } return true; } print(const BitNode *p) { if(p!=NULL) { cout<<p->data; if(p->lchild!=NULL||p->rchild!=NULL) { cout<<"("; print(p->lchild); if(p->rchild!=NULL) { cout<<","; print(p->rchild); } cout<<")"; } } } int main() { int a[]={1,2,3,4,5,6,7,8,9,0,10}; bool taller; BitNode *bt=NULL; for(int i=0;i<11;i++) InsertAvl(bt,a[i],taller); print(bt); cout<<endl; return 0; }
---------------------
作者:林凤g
来源:CSDN
原文:https://blog.csdn.net/fengyanglian/article/details/49637745
版权声明:本文为博主原创文章,转载请附上博文链接!