概述
AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,它是最先发明的自平衡二叉查找树.
在AVL树中任何节点的两个子树的高度最大差别为一.并且,查找、插入、删除等操作在平均和最坏情况下都是O(log n).
AVL树的基本操作都与二叉查找树的算法一致,只有在插入、删除等这种会改变树的平衡性的操作需要使用一些旋转操作来修正树的平衡性.
平衡因子
节点的平衡因子一般是它的左子树的高度减去它的右子树的高度(相反也可以).带有平衡因子为1、0或-1的节点被认为是平衡的.带有平衡因子为-2或2的节点被认为是不平衡的.
计算树的高度与平衡因子的代码如下.
|
|
旋转
旋转操作是用于修复树的平衡性的,它保证了树的有序性与平衡性(旋转操作的具体讲解可以参考《Algorithms,4th Edition》读书笔记-红黑二叉查找树).
|
|
平衡修正
当一个节点被认为是不平衡的时候,我们需要使用一些旋转操作来修正树的平衡,一般有以下情况需要进行旋转.
- 例如当前节点为
x,对x进行平衡修正需要进行以下判断.
- 当
x的平衡因子大于等于2时(左子树高度偏高),对其进行右旋转.
- 当
x的左子树的平衡因子等于-1时(左子树的右子节点高度偏高),对x的左子树进行左旋转.
- 当
x的平衡因子小于等于-2时(右子树高度偏高),对其进行左旋转.
- 当
x的右子树的平衡因子等于1时(右子树的左子节点高度偏高),对x的右子树进行右旋转.
|
|
插入
AVL树的插入和删除与二分查找树的算法一致,只不过在完成插入后需要自底向上的修复平衡性.
|
|
end
- Author : SylvanasSun
- Email : sylvanassun_xtz@163.com
- 本文参考资料引用自Wikipedia