平衡二叉树都通过旋转来调整
LL型
造成不平衡的结点在从上往下第一个不平衡结点的左子树的左子树上
typedef struct AVLNode *AVLTree;
typedef int ElementType;
struct AVLNode{
ElementType data;
AVLTree left;
AVLTree right;
int height;
};
int GetHeight(AVLTree bt)
{
if(bt)
return max(GetHeight(bt->left),GetHeight(bt->right))+1;
return 0;
}
AVLTree LeftRotation(AVLTree a)
{
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;
}
注意!!!调整高度时,不能直接是左子树高度和右子树高度中的最大值加1,因为可能子树为空树,其没有高度这个变量,会发生错误。可能有左空,右空,都空,好麻烦。可以定义一个GetHeight函数求树高,对空树也处理
RR型
造成不平衡的结点在从上往下第一个不平衡结点的右子树的右子树上
AVLTree RightRotation(AVLTree a)
{
AVLTree b=a->right;
a->right=b->left;
b->left=a;
a->height=max(GetHeight(a->left),GetHeight(a->right))+1;
b->height=max(a->height,GetHeight(b->right))+1;
return b;
}
LR型
造成不平衡的结点在从上往下第一个不平衡结点的左子树的右子树上
AVLTree LeftRightRotation(AVLTree a)
{
a->left=RightRotation(a->left);
return LeftRotation(a);
}
RL型
造成不平衡的结点在从上往下第一个不平衡结点的右子树的左子树上
AVLTree RightLeftRotation(AVLTree a)
{
a->right=LeftRotation(a->right);
return RightRotation(a);
}