一、AVL树概念
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
二、导致AVL树不平衡的几种情况
(1)LL:插入一个新节点到根节点的左子树(Left)的左子树(Left),导致根节点的平衡因子由1变为2;
(2)RR:插入一个新节点到根节点的右子树(Right)的右子树(Right),导致根节点的平衡因子由-1变为-2;
(3)LR:插入一个新节点到根节点的左子树(Left)的右子树(Right),导致根节点的平衡因子由1变为2;
(4)RL:插入一个新节点到根节点的右子树(Right)的左子树(Left),导致根节点的平衡因子由-1变为-2;
针对这几种情况导致的不平衡状态,我们可以通过以下几种方法进行调整:
(a)左旋转:将根节点旋转到(原来根节点–>自身)的右孩子上;
(b)右旋转:将根节点旋转到(根节点)的左孩子上
(c)左右双旋:先对根节点的左孩子进行左旋,然后再对根节点进行右旋转
(d)右左双旋:先对根节点的右孩子进行右旋转;再对根节点进行左旋操作
三、AVL树的基本操作
1、AVL树的结点结构
代码如下:
template<class K,class V>
struct AVLNode
{
AVLNode(const K&key, const V&value)
:_pLeft(NULL)
,_pRight(NULL)
, _pParent(NULL)
,_key(key)
,_value(value)
,_bf(0)
{}
AVLNode
2、AVL树的旋转操作
(1)LL需要右旋进行解决,具体旋转过程如下图所示: