• 数据结构 编程1年新手视角的平衡二叉树AVL从C与C++实现②


    接下来,是数据的插入

    我们需要对数据插入的结点先进行判断,有如下三个情况

    当插入的数据value<结点的value,应该递归地插入该结点的左子树(的左子树...的左子树)

    当插入的数据value>结点的value,应该递归地插入结点的右子树(的右子树...的右子树)

    直至递归地到达左右子树为空处,顺利插入并申请一个新的空间(new或者malloc放置新数据),此处是函数的出口。

    那么我们可以写出insert函数

    void insert(node*node, int value){

            if(node==NULL){

                    node = newNode(value);

                    return;

            if(valuevalue){

                    insert(node->left, value);

                    node->height = getUpdateHeight(node);

                    if (//LL型 LR 型){

                    //statement;

                    }

            }

            if(value>node->value){

                    insert(node->right, value);

                    node->height = getUpdateHeight(node);

                    if (//RR型 RL型){

                    //statement;

                    }

            }

    }

    以上预留了//statement位置,应对AVL的平衡特性,正如篇①的情况,插入结点可能会导致冲突/不平衡。根据前人的总结,共有以下4种类型:

    LL型(结点的左子树高度-右子树高度==2,即平衡因子==2,且node的左子树的平衡因子==1),

    LL型对应的操作为右旋rightRotate(node)。

    LR型(node的左子树的平衡因子==-1),LR型可看作成LL型与RR型的结合,对应操作是先对node左子树(RR型)进行左旋leftRotate(node->left),再对node本身(LL型)作右旋rightRotate(node)。

    RR型(结点的左子树高度-右子树高度==-2,且node的右子树的平衡因子==-1),

    RR型对应的操作为左旋leftRotate(node)。

    RL型(node的右子树的平衡因子==1),RL型可看作成RR型与LL型的结合,对应操作是先对node右子树(LL型)进行右旋rightRotate(node->right),再对node本身(RR型)作左旋leftRotate(node)。

  • 相关阅读:
    【Day31】力扣算法(超详细思路+注释)[1441. 用栈操作构建数组 ] [621. 任务调度器]
    客户端Socket传输
    P8973 『GROI-R1』 继续深潜,为了同一个梦想
    秒杀微服务实现抢购代金券功能
    CF1427F-Boring Card Game【贪心】
    【消息队列笔记】chp1-消息队列的使用场景
    滴灌通运营模式遭质疑:是P2P,是套利,还是模式创新?
    #css 自定义checkbox样式解决方案#
    解读随机生成密钥存文件的python代码
    Day35.根据身高重建队列、最少箭数引爆气球
  • 原文地址:https://blog.csdn.net/weixin_68990480/article/details/134226758