#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
版权声明:本文为博主原创文章,转载请附上博文链接!