一. 引言
AVL树是带有平衡条件的二叉查找树.这个平衡条件必须要容易保持,而且它必须保证树的深度是O(logN).一颗AVL树是其每个节点的左子树和右子树的高度最多差一的二叉查找树.
主要介绍插入算法和删除算法.
二. AVL树的结点定义:
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;
typedef int ElementType;
struct AvlNode
{
ElementType Element;
AvlTree Left;
AvlTree Right;
int Height;
};
三. 各种辅助函数:
/*
* 返回两个数中的最大值
*/
static int Max(int a, int b)
{
if(a > b)
return a;
else
return b;
}
/*
在AVL树T中寻找元素值最小的节点,并将其返回
*/
Position FindMin(AvlTree T)
{
if(T == NULL)
return NULL;
else
if(T->Left == NULL)
return T;
else
return FindMin(T->Left);
}
/*
* 返回节点P的高度
*/
static int Height(Position P)
{
if (P == NULL)
return -1;
else
return P->Height;
}
四. 对AVL树进行修复的函数
1. 进行旋转的函数
左单旋转:
可以看到在结点k2处失去了平衡, 并且是在k2的左儿子的左子树上插入的,因此对k2结点进行左单旋转,即将k1作为新的根节点,将k2作为其右儿子,原来k2的右儿子作为k2的左结点,详见示意图(图丑勿怪^_^).
左单旋转的代码:
/*
* 左单旋转
*/
static Position SingleRotateWithLeft(Position K2)
{
Position K1;
K1 = K2->Left;
K2->Left = K1->Right;
K1->Right = K2;
//K2的子节点的高度都没有变化,不需更改
K2->Height