概述
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