目录
【LL失衡、RR失衡、RL失衡和LR失衡后如何修改为AVL树】
【详解LL失衡、RR失衡、RL失衡和LR失衡】
LL失衡、RR失衡、RL失衡和LR失衡都是指在二叉树中,当插入或删除节点后导致左右子树的高度差大于1时所出现的情况。具体定义如下:
- LL失衡:是指在二叉树中,当一个新节点插入到左子树的左子树中时,导致左子树高度比右子树高度大2,此时需要进行旋转调整。
- RR失衡:是指在二叉树中,当一个新节点插入到右子树的右子树中时,导致右子树高度比左子树高度大2,此时需要进行旋转调整。
- RL失衡:是指在二叉树中,当一个新节点插入到左子树的右子树中时,导致左子树高度比右子树高度大2,此时需要进行两次旋转调整。
- LR失衡:是指在二叉树中,当一个新节点插入到右子树的左子树中时,导致右子树高度比左子树高度大2,此时需要进行两次旋转调整。
在对树进行旋转调整以重新平衡后,树的高度差不会超过1,维护了树的平衡性。
【LL失衡、RR失衡、RL失衡和LR失衡后如何修改为AVL树】
【LL失衡:】
在插入节点后,左子树的高度比右子树高度多2,则需要进行右旋操作,将左子树的深度降低,右子树的深度增加。
右旋操作如下:
-
将左子树上升为根节点,原根节点成为右子树的根节点。
-
将原左子树的右子树作为新的根节点的左子树。
-
将原根节点的右子树作为新的根节点的右子树。
LL失衡的示意图:
A B
/ / \
B -> C A
/
C
【RR失衡:】
在插入节点后,右子树的高度比左子树高度多2,则需要进行左旋操作,将右子树的深度降低,左子树的深度增加。
左旋操作如下:
-
将右子树上升为根节点,原根节点成为左子树的根节点。
-
将原右子树的左子树作为新的根节点的右子树。
-
将原根节点的左子树作为新的根节点的左子树。
RR失衡的示意图:
A B
\ / \
B -> A C
\
C
【LR失衡:】
在插入节点后,左子树的高度比右子树高度多2,并且左子树的右子树高度比左子树的左子树高度高,则需要进行左右旋转操作。
左右旋转操作如下:
-
将左子树的右子树作为新的根节点。
-
将原左子树的右子树的左子树作为新的根节点的左子树。
-
将原左子树作为新的根节点的左子树。
-
进行LL失衡的右旋操作。
LR失衡的示意图:
A A C
/ / / \
B -> C -> B A
\ /
C B
【RL失衡:】
在插入节点后,右子树的高度比左子树高度多2,并且右子树的左子树高度比右子树的右子树高度高,则需要进行右左旋转操作。
右左旋转操作如下:
-
将右子树的左子树作为新的根节点。
-
将原右子树的左子树的右子树作为新的根节点的右子树。
-
将原右子树作为新的根节点的右子树。
-
进行RR失衡的左旋操作。
RL失衡的示意图:
A A C
\ / / \
B -> C -> A B
/ \
C B