#include<iostream>
using namespace std;
typedef struct node
{
int data;
int bf;
node *lchild = NULL, *rchild=NULL;
}BiTree;;
void R_rotate(BiTree* &T)
{
BiTree* p = T->lchild;
T->lchild = p->rchild;
p->rchild = T;
T = p;
}
void L_rotate(BiTree* &T)
{
BiTree* p = T->rchild;
T->rchild = p->lchild;
p->lchild = T;
T = p;
}
void LeftBalance(BiTree* &root)
{
BiTree *p = root->lchild;
switch (p->bf)
{
case 1:R_rotate(root);
root->bf = p->bf= 0;
break;//新节点插入在了左子树 LL型
case -1:
BiTree* lr = p->rchild;
switch (lr->bf)
{
case -1:root->bf = 0;
p->bf = 1;
break;
case 0:root->bf = p->bf = 0;
break;
case 1: p->bf = 0;
root->bf = -1;
break;
}
lr->bf = 0;
L_rotate(p);
R_rotate(root);
break;
}
}
void RightBalance(BiTree* &root)
{
BiTree *p = root->rchild;
switch (p->bf)
{
case -1:L_rotate(root);//RR型
root->bf = p->bf = 0;
break;//新节点插入在了右子树 RR型
case 1:
BiTree * ll = p->lchild;
switch (ll->bf)
{
case 0:root->bf = p->bf = 0;
break;
case 1:p->bf = -1;
root->bf = 0;
break;
case -1:root->bf = 1;
p->bf = 0;
break;
}
ll->bf = 0;
R_rotate(p);
L_rotate(root);
}
}
bool InsertAVL(BiTree *&T, int e, bool &flag)
{
if (!T)
{
T = new BiTree;
T->data = e;
T->bf = 0;
flag = true;
return true;
}
else
{
if (e == T->data)//如果有相同节点 不插入
{
flag = false;
return false;
}
if (e < T->data)
{
if (!InsertAVL(T->lchild, e,flag))
return false;
if (flag)//如果在左子树中插入导致左子树长高
{
switch (T->bf)
{
case 1:LeftBalance(T);
flag = false;//平衡后不再高
break;//插入前左子树就比较高 那么插入后应该进行左平衡处理
case 0:T->bf = 1;
flag = true;//原本等高 插入后导致左边偏高
break;
case -1:T->bf = 0;
flag = false;//原本右边高 现在左边插入1后两边等高
break;
}
}
}
else//在右子树中寻找
{
if (!InsertAVL(T->rchild, e,flag))
return false;
if (flag)//如果在右子树中插入导致右边子树长高
{
switch (T->bf)
{
case -1:RightBalance(T);//原本右边高
flag = false;//平衡后不再高
break;//插入前左子树就比较高 那么插入后应该进行左平衡处理
case 0:T->bf = -1;
flag = true;//原本等高 插入后导致右边偏高
break;
case 1:T->bf = 0;
flag = false;//原本左边高 现在右边插入1后两边等高
break;
}
}
}
}
return true;
}
int wait[10];
void search(BiTree* root)
{
if (!root)
{
return;
}
else
{
cout << root->data << " ";
search(root->lchild);
search(root->rchild);
}
}
int main()
{
BiTree* root = NULL;
bool flag = false;
for (int i = 0; i < 10; i++)
{
wait[i] = i + 1;
InsertAVL(root,wait[i],flag);
}
search(root);
_flushall();
getchar();
getchar();
getchar();
return 0;
using namespace std;
typedef struct node
{
int data;
int bf;
node *lchild = NULL, *rchild=NULL;
}BiTree;;
void R_rotate(BiTree* &T)
{
BiTree* p = T->lchild;
T->lchild = p->rchild;
p->rchild = T;
T = p;
}
void L_rotate(BiTree* &T)
{
BiTree* p = T->rchild;
T->rchild = p->lchild;
p->lchild = T;
T = p;
}
void LeftBalance(BiTree* &root)
{
BiTree *p = root->lchild;
switch (p->bf)
{
case 1:R_rotate(root);
root->bf = p->bf= 0;
break;//新节点插入在了左子树 LL型
case -1:
BiTree* lr = p->rchild;
switch (lr->bf)
{
case -1:root->bf = 0;
p->bf = 1;
break;
case 0:root->bf = p->bf = 0;
break;
case 1: p->bf = 0;
root->bf = -1;
break;
}
lr->bf = 0;
L_rotate(p);
R_rotate(root);
break;
}
}
void RightBalance(BiTree* &root)
{
BiTree *p = root->rchild;
switch (p->bf)
{
case -1:L_rotate(root);//RR型
root->bf = p->bf = 0;
break;//新节点插入在了右子树 RR型
case 1:
BiTree * ll = p->lchild;
switch (ll->bf)
{
case 0:root->bf = p->bf = 0;
break;
case 1:p->bf = -1;
root->bf = 0;
break;
case -1:root->bf = 1;
p->bf = 0;
break;
}
ll->bf = 0;
R_rotate(p);
L_rotate(root);
}
}
bool InsertAVL(BiTree *&T, int e, bool &flag)
{
if (!T)
{
T = new BiTree;
T->data = e;
T->bf = 0;
flag = true;
return true;
}
else
{
if (e == T->data)//如果有相同节点 不插入
{
flag = false;
return false;
}
if (e < T->data)
{
if (!InsertAVL(T->lchild, e,flag))
return false;
if (flag)//如果在左子树中插入导致左子树长高
{
switch (T->bf)
{
case 1:LeftBalance(T);
flag = false;//平衡后不再高
break;//插入前左子树就比较高 那么插入后应该进行左平衡处理
case 0:T->bf = 1;
flag = true;//原本等高 插入后导致左边偏高
break;
case -1:T->bf = 0;
flag = false;//原本右边高 现在左边插入1后两边等高
break;
}
}
}
else//在右子树中寻找
{
if (!InsertAVL(T->rchild, e,flag))
return false;
if (flag)//如果在右子树中插入导致右边子树长高
{
switch (T->bf)
{
case -1:RightBalance(T);//原本右边高
flag = false;//平衡后不再高
break;//插入前左子树就比较高 那么插入后应该进行左平衡处理
case 0:T->bf = -1;
flag = true;//原本等高 插入后导致右边偏高
break;
case 1:T->bf = 0;
flag = false;//原本左边高 现在右边插入1后两边等高
break;
}
}
}
}
return true;
}
int wait[10];
void search(BiTree* root)
{
if (!root)
{
return;
}
else
{
cout << root->data << " ";
search(root->lchild);
search(root->rchild);
}
}
int main()
{
BiTree* root = NULL;
bool flag = false;
for (int i = 0; i < 10; i++)
{
wait[i] = i + 1;
InsertAVL(root,wait[i],flag);
}
search(root);
_flushall();
getchar();
getchar();
getchar();
return 0;
}
一点的集中在这个switch中,但其实也并不奇怪,因为平衡树的生成是一边生成树一边平衡以避免在建树完毕后的平衡过程中的联动效应。
解答如下:右平衡中的嵌套switch与之类似不再赘述。