菜鸟一枚,
刚刚学习数据结构与算法,
为了加深理解,
所以与同学们分享学习过程。
今天学习的是,
平衡二叉树!!!
平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
AVL实现方法图解:
代码实现:
#define LH 1 //节点的左子树比右子树深1
#define EH 0 //节点的左子树和右子树一样深度
#define RH -1 //节点的右子树比左子树深1
typedef struct BiTNode
{
int data;
int bf; //平衡因子,即LH、EH、RH
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;
}
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-> =LH;
break;
}
Lr->bf = EH;
L_Rotate(&(*T)->lchild);
R_Rotate(T);
}
}
int InsertAVL(BiTree *T , int e,int *taller)
{
if(!*T)
{
*T = (BiTree)malloc(sizeof(BiTNode)); //建立一个新结点
(*T)->data = e;
(*T)->lchild = (*T)->rchild = NULL;
(*T)->bf = EH;
*taller = TURE;
}
else
{
if(e == (*T)->data)
{
*taller = FALSE;
return = FALSE;
}
if(e< (*T) ->data)
{
if(!InsertAVL(&(*T)->lchild, e , taller))
{
return FALSE;
}
if(*taller)
{
switch((*T)->bf)
{
case LH: //节点有一个左子树状态下,加一个小于节点的数
LeftBalance(T);
*taller = FALSE;
break;
case EH: //平衡状态下,加一个小于节点的数
(*T)->bf =LH;
*taller = TURE;
break;
case RH: //节点有一个右子树的状态下,加一个左子树
(*T)->bf = EH;
*taller = FALSE;
break;
}
}
}
else
{
if(!InsertAVL(&(*T)->lchild, e , taller))
{
return FALSE;
}
if(*taller)
{
switch((*T)->bf)
{
case LH:
(*T)->bf = EH;
*taller = FALSE;
break;
case EH:
(*T)->bf =RH;
*taller = TURE;
break;
case RH:
RightBalance(T);
*taller = FALSE;
break;
}
}
}
}
}
若有错误的地方,请同学们指出。
谢谢同学们的阅读!!!