文章标题
2017-11-17 19:32
417 查看
AVL树
默写。
默写。
#define LH 1 #define EH 0 #define RH -1 typedef struct ssNode{ int data; struct Node* left; struct Node* right; int bf; }Node,*BSTree; void L_Rotate(BSTree & T){ BSTree p=T->right; T->right=p->left; p->left=T; T=p; } void R_Rotate(BSTree & T){ BSTree p=T->left; T->left=p->right; p->right=T; T=p; } void LeftBalance(BSTree & T){ BSTree lc=T->left; switch(lc->bf){ case LH: lc->bf=T->bh=EH; R_Rotate(T);break; case RH: rd=lc->right; switch(rd->bf){ 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->left); R_Rotate(T); } } void RightBalance(BSTree & T){ BSTree rc=T->right; switch(rc->bf){ case RH: rc->bf=EH;T->bf=EH; L_Rotate(T);break; case LH: BSTree ld=rc->left; switch(ld->bf){ case LH: T->bf=EH;rc->bf=RH;break; case RH: T->bf=LH;rc->bf=EH;break; } ld->bf=EH; R_Rotate(T->right); L_Rotate(T); } } int InsertAVL(BSTree &T,int dat.int &taller){ if(!T){ T=new Node; T->data=dat;T->left=T->right=NULL;T->bf=EH;taller=1; return 1; } if(dat==T->data)return 0; if(dat<T->data){ if(!InsertAVl(T->left,dat,taller))return 0; if(taller){ switch(T->bf){ case EH:T->bf=LH;break; case LH:LeftBalance(T);break; case RH:T->bf=EH;break; } } }else{ if(!InsertAVl(T->right,dat,taller))return 0; if(taller){ switch(T->bf){ case EH:T->bf=RH;break; case RH:RightBalance(T);break; case LH:T->bf=EH;break; } } } }