这是我参与「第三届青训营 -后端场」笔记创作活动的第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左旋转),如图所示: