文章目录
定义
AVL树
-
空二叉树是AVL树。
-
如果T是一棵非空的二叉树, T L T_L TL和 T R T_R TR分别是其左子树右子树,当T满足以下条件时,T是一棵AVL树。
- T L T_L TL和 T R T_R TR是AVL树
- ∣ h L − h R ∣ ≤ 1 |h_L-h_R|≤1 ∣hL−hR∣≤1, h L h_L hL和 h R h_R hR分别是左子树和右子树的高度。
- 左右子树均是AVL树
- 左子树与右子树的高度之差的绝对值不超过1
AVL搜索树
-
既是二叉搜索树,也是AVL树
-
AVL树:
(a)
(b)
AVL搜索树:(b)
带索引的AVL搜索树
- 既是带索引的二叉搜索树,也是AVL树
AVL树特征
- n个节点的AVL树的高度是 O ( l o g n ) O(logn) O(logn)。
- 对于每一个n(n≥0)值,都存在一棵AVL树。
- 将一个新元素
插入
到一棵n元素的AVL搜索树中,可得到一棵n+1元素的AVL树,这种插入过程可以在 O ( l o g n ) O(logn) O(logn)时间内完成。 - 从一棵n元素的AVL搜索树中
删除
一个元素,可得到一棵n-1元素的AVL树,这种删除过程可以在 O ( l o g n ) O(logn) O(logn)时间内完成。
- 将一个新元素
- 一棵n元素的AVL搜索树能在 O ( 高度 ) = O ( l o g n ) O(高度)=O(logn) O(高度)=O(logn)的时间内完成搜索。
- 一棵有n个节点的AVL树的高度
- 至多: l o g 2 ( n + 2 ) log_2(n+2) log2(n+2)
- 至少: l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)
AVL树的描述
一般用链表方式来描述,要为每个节点增加一个平衡因子
-
平衡因子(Balance Factor):节点x的平衡因子
bf(x)
定义为:x的左子树的高度-x的右子树的高度
-
AVL树平衡因子的可能取值为:-1,0,和1
AVL搜索树的搜索
即二叉搜索树的搜索
AVL搜索树的插入
二叉搜索树的插入,但得到的树可能不再是AVL树,这时我们需要调整来恢复。每插入一个新节点时,就会调整树的结构。
-
在插入后,A的平衡因子是-2或2,当节点A 已经被确定时,A的不平衡性:
LL
:新插入节点在A节点的左子树的左子树中LR
:新插入节点在A节点的左子树的右子树中RR
:新插入节点在A节点的右子树的右子树中RL
:新插入节点在A节点的右子树的左子树中
-
调整旋转类型
-
单旋转:矫正
LL
和RR
型不平衡所作的转换 -
双旋转:矫正
LR
和RL
型不平衡所作的转换对
LR
型不平衡的旋转可以看作RR
旋转后的LL
旋转旋转调整后——消除不和谐平衡因子
-
LL旋转
模型抽象
流程示例
RR旋转
模型抽象
流程示例
LR旋转
模型抽象
最后就是A,B,C三个最小的作为左子树,最大的作为右子树,中间大的作为根
流程示例
RL旋转
模型抽象
最后就是A,B,C三个最小的作为左子树,最大的作为右子树,中间大的作为根
流程示例
AVL树初始化
(插入应用)
一道例题
⚠️易错提醒:判断是什么旋转要从最底下最先出现的不正常平衡因子那开始,比如上题在插入9
后,要考虑是16\11\9
LL旋转,而非7\16\11
RL旋转
AVL搜索树的删除
通过执行二叉搜索树的删除,可从AVL搜索树中删除一个元素。但也会导致产生不平衡树。
设q:删除节点的父节点。
-
如果q新的平衡因子是0,那么它的高度减少了1,需要改变它的父节点(如果有的话)和其他某些祖先节点的平衡因子。
-
如果q新的平衡因子是-1或1,那么它的高度与删除前相同,无需改变其祖先的平衡因子值。
-
如果q新的平衡因子是-2或2,那么树在q节点是不平衡的,需要调整
- 由删除操作产生的不平衡有六种类型:R0,R1,R-1,L0,L1,L-1。