您的位置:首页 > 其它

文章标题

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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: