定义:AVL树是一棵平衡的二叉排序(查找)树。在这里“平衡”的意思是任意一个结点下的左右子树的高度不超过1(空结点高度为0,叶子结点高度为1)

图中左边非平衡二叉树中,标黄结点45的左右子树的高度差不为1。左子树高度为2(44、43),而右子树的高度为0
效率:AVL树的查找、删除、插入操作在平均和最坏的情况下都为O(logn),因为它时刻维持着二叉树平衡
相关概念
平衡因子(Balance Factor):将二叉树上左子树结点高度减去右子树结点高度的绝对值
最小不平衡子树:距离插入结点最近的,且平衡因子绝对值大于1的结点为根的子树

图中在插入43后,黄色45结点的平衡因子大于2。因此,以结点45为根的结点为最小不平衡子树
AVL树的C语言代码实现
AVL树结点定义:
#define ElemType int
/*
*val:结点存储的值
*height:结点高度,用来运算父亲结点的BF值。取左右子树高度较大值
*lchild、rchild:左孩子、右孩子指针
*/
typedef struct AVLTreeNode {
ElemType val;
int height;
struct AVLTreeNode* lchild;
struct AVLTreeNode* rchild;
}AVLTreeNode, AVLTree*;
一些实现中也会把AVL树的BF值存起来,但这里我们也可以用height值求出BF。因此没有花费多余空间存储
AVL树的高度:
int AVLHeight(AVLTreeNode* pnode) {
return pnode->height;
}
AVL树失衡调整:
在AVL树中,对一个结点的插入或删除操作都可能导致AVL树失衡。因此失衡调整是插入与删除的基本操作
AVL树的失衡可分为四种情况,这里我们逐一分析
假设我们要对数组a[] = { 4, 5, 6, 3, 2, 8, 7, 0, 1 }构建一棵AVL树