二叉平衡树简介和变换| 青训营笔记

114 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

1.概念

二叉平衡搜索树是一种结构平衡的二叉搜索树,即叶节点高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。它能在O()内完成插入、查找和删除操作,最早被发明的平衡二叉搜索树为AVL树。

平衡因子 : 树中某结点其左子树的高度和右子树的高度之差AVL树中的任意一个结点, 其平衡因子绝对值小于2AVL树是一种特殊的二叉搜索树 (BST树), 相对于数据极端情况下, 二叉搜索树会退化成为单链表, AVL树定义了旋转操作, 在平衡因子大于等于2时, AVL树会旋转来调整树的结构, 来重新满足平衡因子小于2

2.旋转操作

旋转操作是一种调整树结构而不改变二叉查找树特性的手段。这里要理解树旋转的意义,树的最终目的不是维护节点与节点之间的层级关系,关键是如何用AVL树这种数据结构进行更好的查找和搜索。

针对四种不平衡类型的调整

为了简化讨论,不妨假设二叉排序树的最小不平衡子树的根结点为 A ,则调整该子树的规律可归纳为下列四种情况: (1)LL 型:

LL情况需要右旋解决,如图所示:


    void RotateR(Node* parent)
    {
        Node* pParent = parent->_parent;
        Node* subL = parent->_left;
        Node* subLR = subL->_right;
        parent->_left = subLR;
        if (subLR)
        {
            subLR->_parent = parent;
        }
​
        subL->_right = parent;
        parent->_parent = subL;
​
        if (_root == parent)
        {
            _root = subL;
            subL->_parent = nullptr;
        }
        else
        {
            if (parent == pParent->_left)
            {
                pParent->_left = subL;
            }
            else
            {
                pParent->_right = subL;
            }
            subL->_parent = pParent;
        }
        parent->_bf = subL->_bf = 0;
    }

(2)RR 型:

RR情况需要左旋解决,如图所示:

(3)LR 型:

LR情况需要左右(先B左旋转,后A右旋转)旋解决,如图所示:

(4)RL 型:

RL情况需要右左旋解决(先B右旋转,后A左旋转),如图所示: