AVL树的实现(C++)

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

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

1. 左单边右旋转

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

AVL树的实现(C++)

代码实现如下:

      /*
    *
    * 左单边向右旋转
    */
    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点右子树上插入节点后,导致的旋转,如下图;

代码如下:

AVL树的实现(C++)

代码如下:

       /*
    *
    * 右单边向左旋转
    *
    */
    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为根,进行左单边右旋转

AVL树的实现(C++)

代码如下:

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

 

4. 边2次旋转

 

上一篇:PAT 1123 Is It a Complete AVL Tree


下一篇:hashMap 和红黑树