单独开一章节介绍 RotateL 、 RotateR 及更复杂的 LR 和 RL 型旋转,更多是为了红黑树的旋转部分做铺垫;由于 AVL 树和红黑树发生旋转的判断标准不同 —— 分别为平衡因子和节点的颜色,两棵树左旋和右旋的在细节上会有一些差异,但从整体来看,二者的精神一致。
定义节点
template <class K, class V> struct AVLTreeNode { AVLTreeNode* _left; AVLTreeNode* _right; pair<K, V> _kv; AVLTreeNode* _parent; int _bf; AVLTreeNode(const pair<K, V>& kv) :_left(nullptr) ,_right(nullptr) ,_kv(kv) ,_parent(nullptr) ,_bf(0) { } };
关于如何快速记忆什么时候为左旋、右旋、或左右旋、或右左旋,有一个小技巧:
当左树更高,需要向右调整高度,此时右旋;
当右树更高,需要向左调整高度,此时左旋 … …
一、新节点插入较高左子树的左侧 —— 引发右单旋
void RotateR(