关于AVL树的简介可以参考: 数据结构与算法——AVL树简介
关于二叉搜索树(也称为二叉查找树)可以参考:数据结构与算法——二叉查找树类的C++实现
AVL-tree是一个"加上了额外平衡条件"的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN)。要求任何节点的左右子树高度相差最多1。
该AVL树结点的数据结构:
struct AvlNode{
Comparable element;
AvlNode * left;
AvlNode * right;
int height;
AvlNode(const Comparable & e, AvlNode * lt, AvlNode * rt, int h = 0):element(e), left(lt), right(rt), height(h){}
};
该结点数据结构其实是一个结点类。
该AVL树的主要成员函数:
void makeEmpty();//清空该树
bool isEmpty() const;//判断该树是否为空
void lessOrderPrintTree();//从小到大输出该AVL平衡树
void biggerOrderPrintTree();//从大到小输出该AVL平衡树
void insert(const Comparable & x);//插入值为x的结点
Comparable findMin() const;//找到最小值
Comparable findMax() const;//找到最大值
主要成员函数介绍:
/****************************************************************
* 函数名称:void insert(const Comparable & x, AvlNode * t)
* 功能描述: 在结点t的后面插入值为x的结点
* 参数列表: x为要插入结点的值
* t为当前的结点
* 返回结果:void
*****************************************************************/
template<typename Comparable>
void AvlTree<Comparable>::insert(const Comparable & x, AvlNode * & t)
{
if(t == NULL)//当前结点为空
t = new AvlNode(x, NULL, NULL);
else if(x < t->element){
insert(x, t->left);
if(height(t->left) - height(t->right) == 2){
if(x < t->left->element)//单旋转,左左插入
rotateWithLeftChild(t);
else
doubleWithLeftChild(t);//双旋转,左右插入
}
}
else if(x > t->element){
insert(x, t->right);
if(height(t->right) - height(t->left) == 2){
if(x > t->right->element)//单旋转,右右插入
rotateWithRightChild(t);
else
doubleWithRightChild(t);//双旋转,右左插入
}
}
//如果x的值和当前结点的值相同,则忽略。也可以向之前二叉查找树一样给每个结点再加一个num成员变量。
t->height = max(height(t->left), height(t->right)) + 1;//更新结点t的高度
}
/****************************************************************
* 函数名称:rotateWithLeftChild(AvlNode *t)
* 功能描述: 将当前结点进行单旋转,用于左左插入的时候
* 参数列表: t是指向当前结点的指针
* 返回结果:无
*****************************************************************/
template<typename Comparable>
void AvlTree<Comparable>::rotateWithLeftChild(AvlNode * & k2)
{
cout << "左单旋转" << endl;
AvlNode * k1 = k2->left;
k2->left = k1->right;
k1->right = k2;
k2->height = max(height(k2->left), height(k2->right)) + 1;
k1->height = max(height(k1->left), k2->height) + 1;
k2 = k1;
}
/****************************************************************
* 函数名称:rotateWithRightChild(AvlNode *t)
* 功能描述: 将当前结点进行单旋转,用于左右插入的时候
* 参数列表: t是指向当前结点的指针
* 返回结果:无
*****************************************************************/
templ