AVL Tree - tenji/ks GitHub Wiki
AVL 树
AVL 树(以发明人 Adelson-Velsky 和 Landis 命名)是一种自平衡二叉搜索树(Self-Balancing Binary Search Tree)。在 AVL 树中,任意节点的两个子子树的高度最多相差 1;如果在任何时候它们相差超过一,则进行重新平衡(Rebalancing)以恢复该属性。
历史
AVL 树以其两位苏联发明者 Georgy Adelson-Velsky 和 Evgenii Landis 的名字命名,他们在 1962 年的论文“信息组织算法”(An algorithm for the organization of information)中发表了该树。它是被发明的最古老的自平衡二叉搜索树数据结构。
基本概念
平衡系数(Balance factor)
在二叉树中,节点 X 的平衡因子定义为以节点 X 为根的两个子树的高度差:
$BF(X) := Height(RightSubtree(X)) - Height(LeftSubtree(X))$
在 AVL 树中,平衡因子的取值范围是 -1, 0, 1,分别表示左子树比右子树高、左右子树高度相等、左子树比右子树矮。为了最大化实现查找、插入和删除操作的效率,AVL 树始终保持平衡因子绝对值不超过 1 的节点作为根节点。
AVL 树的特性
- 特性1:对于任何一颗子树的 root 根结点而言,它的左子树任何节点的 key 一定比 root 小,而右子树任何节点的 key 一定比 root 大;
- 特性2:对于 AVL 树而言,其中任何子树仍然是 AVL 树;
- 特性3:每个节点的左右子节点的高度之差的绝对值最多为 1;
AVL 树和 BST 是什么关系?
- AVL 本身首先是一棵 BST 二叉搜索树;
- AVL 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为 1。
也就是说,AVL 树,本质上是带了平衡功能的二叉搜索树。
基本操作
搜索(Searching)
遍历(Traversal)
插入(Insert)
删除(Delete)
再平衡(Rebalancing)
左左结构失衡(LL型失衡)
右右结构失衡(RR型失衡)
左右结构失衡(LR型失衡)
右左结构失衡(RL型失衡)
AVL 树再平衡最多需要多少次旋转?
AVL 的每一次插入结点操作最多只需要旋转 1 次(单旋转或双旋转),每一次删除操作最多需要 O(logn)
次旋转。
Java 实现
...
优点
- AVL 树可以自我平衡,因此为搜索、插入和删除提供了
O(logn)
的时间复杂度; - AVL 树是二叉搜索树(具有平衡性),因此可以按排序顺序遍历项目;
- 由于平衡规则比红黑树严格,AVL树一般具有相对较小的高度,因此搜索速度更快;
- 与红黑树相比,AVL 树的理解和实现相对简单。
缺点
- 与普通 BST 相比实现较难,与 Red Black 相比较容易实现;
- 与红黑树相比,使用较少;
- 由于其相当严格的平衡,AVL 树的插入和删除操作会变得复杂,因为需要执行更多的旋转。