平衡二叉树
什么是平衡二叉树
【例】搜索树结点不同插入次序,将导致不同的深度和平均查找长度ASL。
将月份按照不同次序插入二叉搜索树,依据字典顺序比较大小,得到三棵不同的树如下:
ASL的不同,导致二叉搜索树的搜索效率不同,ASL越小,搜索效率越高,故引进了平衡二叉树的概念。
一些概念
“平衡因子(Balance Factor,简称BF)”: B F ( T ) = h L − h R BF(T)=h_L-h_R BF(T)=hL−hR。其中 h L h_L hL和 h R h_R hR分别为 T T T的左、右子树的高度。
平衡二叉树定义
平衡二叉树(Balanced Binary Tree)(AVL树)
空树,或者
任一结点的左、右子树高度差的绝对值不超过1,即 ∣ B F ( T ) ∣ ≤ 1 |BF(T)| \leq 1 ∣BF(T)∣≤1的树。
平衡二叉树的一些性质
设
n
n
n为高度是h的平衡二叉树的结点数。结点数最少时:
h
=
O
(
l
o
g
2
n
)
h=O(log_2n)
h=O(log2n)
即给定结点数为n的AVL树的最大高度为
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)。
平衡二叉树的调整
一些概念
当在平衡二叉树中插入新的结点时,有的结点的平衡因子的绝对值会改变并大于1,由此引出两个概念:
- 不平衡的“发现者”:在插入新的结点并使得平衡二叉树变成非平衡二叉树时,平衡因子绝对值大于1的结点。
- “麻烦结点”:插入时,如果平衡二叉树变成非平衡二叉树,则该结点被称为麻烦结点。
【例】以下平衡树(依据字典顺序判定大小):
当插入新节点Nov之后,平衡二叉树变成了非平衡二叉树:
插入新结点Nov之后,Mar结点的平衡因子变成了-2,故发现者是Mar结点,而麻烦结点则是Nov结点。
平衡二叉树的调整方法
前提:平衡二叉树是一棵二叉搜索树,所以调整之后,一定要保证仍然是一棵二叉搜索树。
根据麻烦结点与离麻烦结点最近的发现者(因为发现者可能有很多个)的相对位置关系可将调整归为以下4种:
-
RR旋转(右单旋):麻烦结点在发现者右子树的右边
【例】:
插入前:
插入后:
麻烦结点Nov在离其最近的发现者Mar的右子树的右边,所以这时候需要进行RR旋转
RR旋转的基本模式:
-
LL旋转(左单旋):麻烦结点在发现者左子树的左边
【例】:
插入前:
插入后:
麻烦结点Apr在离其最近的发现者Mar的左子树的左边,所以这时候需要进行LL旋转
LL旋转的基本模式:
-
LR旋转:麻烦结点在发现者左子树的右边
【例】:
插入前:
插入后:
麻烦结点Jan在离其最近的发现者May的左子树的右边,所以这时候需要进行LR旋转
LR旋转的基本模式:
-
RL旋转:麻烦结点在发现者右子树的左边
【例】:
插入前:
插入后:
麻烦结点Feb在离其最近的发现者Aug的右子树的左边,所以这时候需要进行RL旋转
RL旋转的基本模式: