一、背景知识
AVL树是高度平的二叉搜索树,它能降低二叉树的高度,减少树的平均搜索长度.
二、AVL树的性质
1、左子树和右子树的高度差的绝对值不超过1
2、树中的每个左子树和右子树都是AVL树
3、每个节点都有一个平衡因子(balance factor--bf),任一节点的平衡因子都为-1,0,1。(每个节点的平衡因子等于右子树的高度减去左子树的高度)
三、AVL的效率
一棵AVL树有N个节点,高度可以保持在log2n,插入/删除/查找的时间复杂度也是log2n.
(注:log2n表示log以2为底n的对数。)
四、AVL的实现(代码及分析)
AVL树(K/V)的结点
template<class K,class T>
struct AVLTreeNode
{
K _key; //搜索的关键字
T _value; //数值
int _bf; //平衡因子
AVLTreeNode<K, T>* _left;
AVLTreeNode<K, T>* _right;
AVLTreeNode<K, T>* _parent;
AVLTreeNode(const K& key, const T& value)
:_key(key)
, _value(value)
, _bf(0)
, _left(NULL)
, _right(NULL)
, _parent(NULL)
{}
};
AVL树的旋转
当增加一个元素,如果破坏了-1,0,1这样的平衡因子的时候,就需要通过旋转来修改平衡因子。
代码实现(左单旋转)
void RotateL(Node* parent)
{
Node* subR = parent->_right;
Node* subRL = subR->_left;
parent->_right = subRL;
if (subRL) //判断
subRL->_parent = parent;
subR->_left = parent;
Node* ppNode = parent->_parent;
parent->_parent = subR;
if (ppNode == NULL)
{
_root = subR;
subR->_parent = NULL;
}
else
{
if (ppNode->