AVL树的旋转
在将旋转这一块,最好理解的就是图,所以我主要采取图解的方式,来讲述左单旋、右单旋、以及双旋。
在讲VAL树的旋转之前,先来了解一下VAL树的特性。
AVL树的特性
AVL树是一个严格平衡的二叉搜索树。二叉搜索树有可能是单支的,在单支二叉树下,搜索的时间复杂度是O(N),性能比较低,所以VAL树就出现了。VAL树规定当向二叉搜索树插入新节点后,要保证每一个节点的左右子树的高度只差的绝对值小于1。就相当于一颗近似等高的二叉搜索树。所以,二叉搜索树是高度平衡的,搜索的效率能达到O(lgN)
AVL树本身就是一颗二叉搜索树,插入要满足二叉搜索树的规则,小于节点值的,插入节点的左子树,大于节点值的,插入到节点的右子树。插入的值是不一定的,它怎么能达到左右子树的高度差小于1?
没错,就是靠AVL的旋转。
在看旋转之前,让我们来看一下,AVL树节点的定义
AVL树节点的定义
template<class K, class V>
struct AVLTreeNode
{
AVLTreeNode<K, V>* _left; //该节点的左孩子
AVLTreeNode<K, V>* _right; //该节点的右孩子
AVLTreeNode<K, V>* _parent;//该节点的父亲节点
pair<K, V> _kv; // 该节点的值
int _bf; // 平衡因子
AVLTreeNode(const pair<K, V>& kv) //节点的构造函数
:_left(nullptr)
, _right(nullptr)
, _parent(nullptr)
, _bf(0)
, _kv(kv