数据结构与算法——AVL树类的C++实现

关于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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值