AVL插入结点
通过这张图来描述AVL平衡树在插入新结点过程中,通过旋转操作来达到自平衡的四种场景:
- LL单旋转:新结点插入在A的左孩子(L)的左子树(L),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号相同(2,1),只需要一次右旋操作即可重新达到平衡。
- LR双旋转:新结点插入在A的左孩子(L)的右子树(R),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号不同(2,-1),先对以B为根的二叉树左旋一次,再对以A为根的二叉树右旋一次即可重新达到平衡。
- RL双旋转:新结点插入在A的右孩子(R)的左子树(L),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号不同(-2,1),先对以B为根的二叉树左旋一次,再对以A为根的二叉树右旋一次即可重新达到平衡。
- RR单旋转:新结点插入在A的右孩子(R)的右子树(R),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号相同(-2,-1),对以A为根的二叉树右旋一次即可重新达到平衡。
所以,实际上只有左旋和右旋两种最基本的操作,只是每次旋转的二叉树不一样。对一棵二叉树进行旋转,实际上就是让其根结点的左孩子(右旋)或者右孩子(左旋)来代替原根结点的位置,并保证整棵树中序遍历的顺序不变。
注解:
- 其中的A结点是插入新结点的祖先,在插入新结点前,以这个结点为根结点的二叉树的平衡因子一定是1或者-1。
- 不平衡树中的平衡因子的值限于-2,-1,0,1和2。
- 从根到新插入结点的路径上,只有经过的结点的平衡因子才会在插入后改变。
- 图中A/B/C这样的代表单个结点,带下标的结点都代表一颗子树。
AVL删除结点
删除AVL平衡树结点后的平衡处理和插入类似,不过有下面6种场景,删除结点在A的右子树为R型不平衡,删除结点在左子树为L型不平衡。对于这些场景,同样是围绕着对删除前平衡因子为-1或者1,删除后平衡因子为-2或者2的子树进行讨论:
- R0单旋转:删除的是A右子树的结点,删除后A的平衡因子为2,并且其左子树的平衡因子为0,一次右旋操作即可重新达到平衡。
- R1单旋转:删除的是A右子树的结点,删除后A的平衡因子为2,并且其左子树的平衡因子为1,一次右旋操作即可重新达到平衡。
- R-1双旋转:删除的是A右子树的结点,删除后A的平衡因子为2,并且其左子树的平衡因子为-1,因为删除后A和B的平衡因子符号不同,所以需要两次旋转才能重新达到平衡。
- L0单旋转:删除的是A左子树的结点,删除后A的平衡因子为-2,并且其右子树的平衡因子为0,一次左旋操作即可重新达到平衡。
- L-1单旋转:删除的是A左子树的结点,删除后A的平衡因子为-2,并且其右子树的平衡因子为1,一次左旋操作即可重新达到平衡。
- L1双旋转:删除的是A左子树的结点,删除后A的平衡因子为-2,并且其右子树的平衡因子为-1,因为删除后A和B的平衡因子符号不同,所以需要两次旋转才能重新达到平衡。
下面的图描述了对R型不平衡的处理:
来源:CSDN
作者:Hello Hunk
链接:https://blog.csdn.net/u012299594/article/details/84924674