一、介绍
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(logn)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。
节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。
二、AVL树的C++实现
2.1 树节点
template <class T>
struct BSTNode{
T data;
int h;
BSTNode<T> * lchild, * rchild;
};
2.2 类声明
template <class T>
class AVLTree{
public:
AVLTree():root(NULL){}
~AVLTree(){Release(root);}
bool Insert(T x){return Insert(root,x);}
bool Delete(T x){Delete(root,x);}
bool Search(T &x){return !(Search(root,x)==NULL);}
bool Modify(const T &x);
void PreOrder(void visit(const T &x)){PreOrder(root,visit);}
void InOrder(void visit(const T &x)){InOrder(root,visit);}
private:
BSTNode<T> * root;
void Release(BSTNode<T> * bst);
inline int Height(BSTNode<T> * bst){return (bst==NULL?-1:bst->h);}
void SingleRotateWithLeft(BSTNode<T> * &bst); //LL型
void DoubleRotateWithLeft(BSTNode<T> * &bst); //LR型
void SingleRotateWithRight(BSTNode<T> * &bst); //RR型
void DoubleRotateWithRight(BSTNode<T> * &bst); //RL型
bool Insert(BSTNode<T> * &bst, const T &x);
bool Delete(BSTNode<T> * &bst, const T &x);
BSTNode<T> * Search(BSTNode<T> * bst, T &x);
void PreOrder(BSTNode<T> * bst, void visit(const T& x));
void InOrder(BSTNode<T> * bst, void visit(const T& x));
};
2.3 插入操作
AVL树在算法设计上与普通二叉排序树的最大区别在于AVL树在插入和删除后必须进行重平衡操作。