介绍
AVL树是根据它的发明者Adelson-Velsky和Landis命名的。
AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持,而且保证树的深度必须是$O(\log{N})$,所以AVL树的查找、插入和删除在平均和最坏情况下都是$O(\log{N})$。
它的特点是AVL树中任何节点的两个子树的高度最大差别为1。
节点定义
|
|
恢复平衡
当发生插入或删除操作时,就有可能破坏AVL树的平衡条件,所以为了恢复平衡需要对树进行简单的修正,也就是旋转。
旋转分为4种状态两种情况,如下图:
1. 插入发生在“外边”的情况(即左-左或右-右的情况),该情况通过树的一次单旋转完成调整。
2. 插入发生在“内部”的情况(即左-右或右-左的情况),该情况通过复杂些的双旋转完成调整。
左左(LL) 旋转
如下图,左边是旋转之前的树,右边是旋转之后的树。从中可以发现,经过一次旋转又变成了AVL树。
对于LL旋转,你可以这样理解为:LL旋转是围绕”失去平衡的AVL根节点”进行的,也就是节点k2;而且由于是LL情况,即左左情况,就用手抓着”左孩子,即k1”使劲摇。将k1变成根节点,k2变成k1的右子树,”k1的右子树”变成”k2的左子树”。
右右(LL) 旋转
RR是与LL对称的情况,如下图,也是经过一次旋转又变成了AVL树。
左右(LR) 旋转
LR失去平衡的情况,需要经过两次旋转才能让AVL树恢复平衡。
第一次旋转是围绕”k1”进行的”RR旋转”,第二次是围绕”k3”进行的”LL旋转”。
右左(RL) 旋转
RL是与LR的对称情况!RL恢复平衡的旋转方法如下图。
第一次旋转是围绕”k3”进行的”LL旋转”,第二次是围绕”k1”进行的”RR旋转”。
完整实现
|
|