#include <iostream>
using namespace std;
#define EH 0 //等高
#define LH 1 //左高
#define RH -1 //右高
typedef struct TNode
{
int data;
int bf;
struct TNode* lchild;
struct TNode* rchild;
}BiTree;
void L_Rotate( BiTree*& T )//左旋
{
BiTree* p = T->rchild;
T->rchild = p->lchild;
p->lchild = T;
T = p;
}
void R_Rotate( BiTree*& T )//右旋
{
BiTree* p = T->lchild;
T->lchild = p->rchild;
p->rchild = T;
T = p;
}
void LeafBalance( BiTree*& T )//左平衡处理
{
BiTree* L = T->lchild;
switch( L->bf )
{
case LH:
T->bf = EH;
L->bf = EH;
R_Rotate( T );
break;
case RH:
BiTree* Lr = L->rchild;
switch( Lr->bf )
{
case EH:
T->bf = EH;
L->bf = EH;
break;
case LH:
T->bf = RH;
L->bf = EH;
break;
case RH:
T->bf = EH;
L->bf = LH;
break;
}
Lr->bf = EH;
L_Rotate( T->rchild ); //先左旋
R_Rotate( T );//再右旋
break;
}
}
void RightBalance( BiTree*& T )//右平衡处理
{
BiTree* L = T->rchild;
switch( L->bf )
{
case RH:
T->bf = EH;
L->bf = EH;
L_Rotate( T );
break;
case LH:
BiTree* Ll = L->lchild;
switch( Ll->bf )
{
case EH:
T->bf = EH;
L->bf = EH;
break;
case LH:
T->bf = EH;
L->bf = RH;
break;
case RH:
T->bf = LH;
L->bf = EH;
break;
}
Ll->bf = EH;
R_Rotate( T->rchild ); //先右旋
L_Rotate( T );//再左旋
break;
}
}
bool InsertAVL( BiTree*& T, int key, bool& taller )
{
if ( !T )
{
//插入新结点,树长高,置taller为true
T = new BiTree;
memset( T, 0, sizeof(BiTree) );
T->data = key;
T->bf = EH;
taller = true;
}
else
{
if ( key == T->data )
{
//树中已存在和key相同关键字的结点则不再插入
taller = false;
return false;
}
if ( key < T->data )
{
//继续在左子树下搜索
if ( !InsertAVL( T->lchild, key, taller ) )
return false;
if ( taller )
{
//已插入到T的左子树中且左子树长高
switch( T->bf )
{
case EH://原本左右子树等高,现因左子树长高而树升高
T->bf = LH;
taller = true;
break;
case RH://原本右子树高,现在等高了
T->bf = EH;
taller = false;
break;
case LH://原本左子树高,现在失去平衡了,需做左平衡处理
LeafBalance( T );
taller = false;
break;
}
}
}
else
{
//继续在右子树下搜索
if ( !InsertAVL( T->rchild, key, taller ) )
return false;
if ( taller )
{
//已插入到T的右子树中且右子树长高
switch( T->bf )
{
case EH://原本左右子树等高,现因右子树长高而树升高
T->bf = RH;
taller = true;
break;
case LH://原本左子树高,现在等高了
T->bf = EH;
taller = false;
break;
case RH://原本右子树高,现在失去平衡了,需做右平衡处理
RightBalance( T );
taller = false;
break;
}
}
}
}
return true;
}
void PrintBiTree( const BiTree*const& T )
{
if ( T )
{
PrintBiTree( T->lchild );
cout << T->data << " ";
PrintBiTree( T->rchild );
}
}
int main()
{
int a[10] = {3, 2, 1, 4, 5, 6, 7, 10, 9, 8};
BiTree* T = NULL;
bool taller = false;
for ( int i = 0; i < 10; ++i )
{
InsertAVL( T, a[i], taller );
}
PrintBiTree( T );
cout << endl;
return 0;
}