平衡二叉树(AVL树):
空树,或者
任一结点左、右子树高度差的绝对值不超过1,即|BF(T)| <= 1
不平衡的发现者Mar,麻烦结点Nov在发现者右子树的右边,因而叫RR插入,需要RR旋转
不平衡的发现者Mar,麻烦结点Apr在发现者左子树的左边,因而叫LL插入,需要LL旋转
typedef struct AVLNode *Position;
typedef Position AVLTree;//AVL树类型
typedef struct AVLNode{
ElementType Data;//结点数据
AVLTree Left;//指向左子树
AVLTree Right;//指向右子树
int Height; //树高
};
int Max(int a,int b)
{
return a>b?a:b;
}
AVLTree SingleLeftRotation(AVLTree A)
{
//注意:A必须有一个左子结点B
//将A与B做左旋转,更新A与B的高度,返回新的根结点B
AVLTree B = A->Left;
A->Left = B->Right;
B->Right = A;
A->Height = Max(GetHeight(A->Left),GetHeight(A->Right)) + 1;
B->Height = Max(GetHeight(B->Left),A->Height) + 1;
return B;
}
AVLTree SingleRightRotation(AVLTree A)
{
//注意:A必须有一个右子结点B
//将A与B做右旋转,更新A与B的高度,返回新的根结点B
AVLTree B = A->Right;
A->Right = B->Left;
B->Left = A;
A->Height = Max(GetHeight(A->Left),GetHeight(A->Right)) + 1;
B->Height = Max(GetHeight(B->Left),A->Height) + 1;
return B;
}
AVLTree DoubleLeftRightRotation(AVLTree A)
{
//注意:A必须有一个左结点B,且B必须有一个右结点C
//将A、B、C做两次单旋,返回新的根节点C
//将B、C做右单旋,C被返回
A->Left = SingleRightRotation(A->Left);
//将A、C做左单旋,C被返回
return SingleLeftRotation(A);
}
AVLTree DoubleRightLeftRotation(AVLTree A)
{
//注意:A必须有一个右结点B,且B必须有一个左结点C
//将A、B、C做两次单旋,返回新的根结点C
//将B、C做左单旋,C被返回
A->Right = SingleLeftRotation(A->Right);
//将A、C做右单旋,C被返回
return SingleRightRotation(A);
}
AVLTree Insert(AVLTree T,ElementType X)
{
//将X插入AVL树T中,并返回调整后的AVL树
if(!T){//若插入空树,则新建
T = (AVLTree)malloc(sizeof(struct AVLNode));
T->Data = X;
T->Height = 0;
T->Left = T->Right = NULL;
}
else if(X < T->Data){
//插入T的左子树
T->Left = Insert(T->Left,X);
//如果需要左旋
if(GetHeight(T->Left)-GetHeight(T->Right)==2){
if(x<T->Left->Data)
T = SingleLeftRotation(T);
else
T = DoubleLeftRightRotation(T);
}
}
else if(X > T->Data){
//插入T的右子树
T->Left = Insert(T->Left,X);
//如果需要右旋
if(GetHeight(T->Left) - GetHeight(T->Right) == -2){
if(X > T->Right->Data)
T = SingleRightRotation(T);
else
T = DoubleRightRotation(T);
}
}
T->Height = Max(GetHeight(T->Left),GetHeight(T->Right)) + 1;
return T;
}