平衡二叉树(Balanced Binary Tree)是一种特殊的二叉搜索树(BST),它确保了树的高度尽可能低,从而保证了查找、插入和删除操作的时间复杂度接近O(log n)。为了保持平衡,平衡二叉树(如AVL树、红黑树等)在插入或删除节点后可能会进行旋转操作。
这里我们主要讨论AVL树的旋转操作,包括左旋(Left Rotation)和右旋(Right Rotation)。
左旋(Left Rotation)
左旋操作通常发生在右子树比左子树高很多,导致树不平衡时。左旋的目的是将较高的右子树的一部分移动到左子树中,以降低树的高度并恢复平衡。
示例:
假设我们有一个AVL树,其结构如下:
1
\
2
\
3
这个树不平衡,因为1的平衡因子为-2,左子树为0,又子树为2
左旋后的树结构如下:
2
/ \
1 3
步骤解释:
- 将1的右子树(2)提升为新的根节点。
- 将原来的根节点1降为新的根节点2的左子节点。
右旋(Right Rotation)
右旋操作与左旋相反,通常发生在左子树比右子树高很多时。右旋的目的是将较高的左子树的一部分移动到右子树中。
示例:
假设我们有一个AVL树,其结构如下:
3
/
2
/
1
这个树不平衡,因为左子树比右子树高,平衡因子为2。
右旋后的树结构如下:
2
/ \
1 3
步骤解释:
- 将3的左子树(2)提升为新的根节点。
- 将原来的根节点3降为新的根节点2的右子节点。
先右后左双旋转(RL旋转)
RL旋转通常发生在以下情况:由于在A的右孩子的左子树上插入新节点导致以A为根的子树失去平衡。
示例:
假设我们有一个AVL树,其结构如下:
10
/ \
5 20
/ \
15 25
现在我们在以10为根(A)的右子树(20)的左子树(15)上插入一个新节点18,导致树失去平衡。为了恢复平衡,我们需要进行RL旋转。
10
/ \
5 20
/ \
15 25
\
18
- 首先进行右旋:
10
/ \
5 15
\
20
/ \
18 25
- 然后左旋
15
/ \
10 20
/ / \
5 18 25
先左后右双旋转(LR旋转)
LR旋转与RL旋转相反,通常发生在以下情况:在A的左孩子的右子树上插入新节点,导致以A为根的子树失去平衡。
示例
假设我们有一个AVL树,其结构如下:
10
/ \
5 20
/ \
4 8
现在我们在以10为根(A)的左子树(5)的右子树(8)上插入一个新节点9,导致树失去平衡。为了恢复平衡,我们需要进行RL旋转。
10
/ \
5 20
/ \
4 8
\
9
- 左旋
10
/ \
8 20
/ \
5 9
/
4
-
右旋
8
/ \
5 10
/ / \
4 9 20
1624

被折叠的 条评论
为什么被折叠?



