编程语言
首页 > 编程语言> > AVL树的实现(C++)

AVL树的实现(C++)

作者:互联网

AVL树,即平衡二叉搜索树,并且其左右子树的高度相差小于等于1。

AVL树的实现,在于插入节点的同时,保持树的平衡性。共分为如下四种旋转:

1. 左单边右旋转

当在k1的左子树上插入节点以后,导致K2失去平衡后的旋转。

代码实现如下:

      /*
    *
    * 左单边向右旋转
    */
    void singleRotateWithLeft(AvlNode * & k2)
    {
        AvlNode * k1 = k2->left;
        k2->left = k1->right;
        k1->right = k2;

        k2->h = max(h(k2->left), h(k2->right)) + 1;
        k1->h = max(h(k1->left), h(k1->right)) + 1;

        k2 = k1;
    }

2. 右单边左旋转

 当在K2点右子树上插入节点后,导致的旋转,如下图;

代码如下:

代码如下:

       /*
    *
    * 右单边向左旋转
    *
    */
    void singleRotateWithRight(AvlNode * & k1)
    {
        AvlNode * k2 = k1->right;
        k1->right = k2->left;
        k2->left = k1;

        k1->h = max(h(k1->left), h(k1->right)) + 1;
        k2->h = max(h(k2->left), h(k2->right)) + 1;

        k1 = k2;
    }

 

3. 左边2次旋转:

 当在K1的右子树上插入节点,导致K3失去平衡后的旋转。此时,需要做2次旋转。

a. 以K1为根,进行右单边左旋转

b. 以K3为根,进行左单边右旋转

代码如下:

      /*
    *
    * 左单边向右doube旋转    
    */
    void doubleRotateWithLeft(AvlNode * & node)
    {
        singleRotateWithRight(node->left);
        singleRotateWithLeft(node);
    }

 

4. 边2次旋转

 

标签:right,实现,AvlNode,C++,旋转,AVL,k2,k1,left
来源: https://www.cnblogs.com/ordili/p/10432596.html