ACM模版

## 构建平衡二叉树

#define LH 1
#define EH 0
#define RH -1

//  结点
typedef struct BiTNode
{
int data;
int bf;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

//  右旋
void R_Rotate(BiTree *p)
{
BiTree L;
L = (*p)->lchild;
(*p)->lchild = L->rchild;
L->rchild = (*p);
*p = L;
return ;
}

//  左旋
void L_Rotate(BiTree *p)
{
BiTree L;
L = (*p)->rchild;
(*p)->rchild = L->lchild;
L->lchild = (*p);
*p = L;
return ;
}

//  左边深旋转
void LeftBalance(BiTree *T)
{
BiTree L, Lr;
L = (*T)->lchild;

switch (L->bf)
{
case LH:
(*T)->bf = L->bf = EH;
R_Rotate(T);            //  右旋即可
break;
case RH:
Lr = L->rchild;
switch (Lr->bf)
{
case LH:
(*T)->bf = RH;
L->bf = EH;
break;
case EH:
(*T)->bf = L->bf = EH;
break;
case RH:
(*T)->bf = EH;
L->bf = LH;
break;
}
Lr->bf = EH;
L_Rotate(&(*T)->lchild);//  先左旋
R_Rotate(T);            //  后右旋
break;
}
return ;
}

//  右边深旋转
void RightBalance(BiTree *T)
{
BiTree L, Ll;
L = (*T)->rchild;

switch (L->bf)
{
case RH:
(*T)->bf = L->bf = EH;
L_Rotate(T);            //  左旋即可
break;
case LH:
Ll = L->lchild;
switch (Ll->bf)
{
case LH:
(*T)->bf = RH;
L->bf = EH;
break;
case EH:
(*T)->bf = L->bf = EH;
break;
case RH:
(*T)->bf = EH;
L->bf = LH;
break;
}
Ll->bf = EH;
R_Rotate(&(*T)->rchild);//  先右旋
L_Rotate(T);            //  后左旋
break;
}
return ;
}

//  插入AVL结点
bool InsertAVL(BiTree *T, int e, bool *taller)
{
if (!*T)
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = e;
(*T)->lchild = (*T)->rchild = NULL;
(*T)->bf = EH;
*taller = true;
}
else
{
if (e == (*T)->data)    //  已经存在e
{
*taller = false;
return false;
}
if (e < (*T)->data)     //  小于data向左递归
{
if (!InsertAVL(&(*T)->lchild, e, taller))
{
return false;
}
switch ((*T)->bf)
{
case LH:    //  左边深，插入前需要旋转
LeftBalance(T);
*taller = false;
break;
case EH:    //  平衡，插入后变为左边深
(*T)->bf = LH;
break;
case RH:    //  右边深，插入后变为平衡
(*T)->bf = EH;
*taller = false;
break;
}
}
else                    //  大于data向右递归
{
if (!InsertAVL(&(*T)->rchild, e, taller))
{
return false;
}
switch ((*T)->bf)
{
case LH:    //  左边深，插入后变为平衡
(*T)->bf = EH;
*taller = false;
break;
case EH:    //  平衡，插入后变为右边深
(*T)->bf = RH;
break;
case RH:    //  右边深，插入前需要旋转
RightBalance(T);
*taller = false;
break;
}
}
}
return *taller;
}


f_zyj

• 擅长领域：
• ACM
• 挑战程序设计
• C/C++

#### 面试题之平衡二叉树

2014-04-16 17:35:07

#### 平衡二叉树的好处

2014-05-25 15:04:52

#### 平衡二叉树转换

2014-12-17 12:32:52

#### 平衡二叉树的实现代码

2015-08-21 20:53:00

#### 平衡二叉树课程设计 课程设计

2010年07月02日 334KB 下载

#### 平衡二叉树 之 红黑树

2013-12-11 14:36:42

#### java实现平衡二叉树(详细分析)

2012-09-04 00:03:28

#### 算法导论 之 平衡二叉树 - 删除 - 递归[C语言]

2013-12-20 12:19:27

#### poj 3481 Double Queue（平衡二叉树基础练习题）

2015-04-19 00:15:49

#### 平衡二叉树实现的实例

2015-08-19 21:11:59