Balance Tree

#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;

}



一点的集中在这个switch中,但其实也并不奇怪,因为平衡树的生成是一边生成树一边平衡以避免在建树完毕后的平衡过程中的联动效应。

解答如下:右平衡中的嵌套switch与之类似不再赘述。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值