平衡二叉树(AVL)插入时的旋转操作(无代码)
前言
首先感谢下列文章为作者提供思路,其次本文为作者未来查阅所写。
平衡二叉树(AVL)图解与实现.
平衡二叉树的旋转.
平衡二叉树的LR旋转的两种情况.
本次作图使用下列网站资源:
数据结构可视化.
一、平衡二叉树的定义
平衡树(Balance Tree,BT) 指的是,任意节点的,子树的高度差都小于等于1。且其中序遍历序列为有序递增序列(本文均按照左小右大定义)。
二、引入两个概念
1.最小不平衡子树根节点(简称:最小失衡点)
如图2-1-1所示:此时若观察以20为根节点的AVL,其平衡,但以36为根节点的子树不平衡(以36为根节点的子树左子树高为0,右子树高为2,左右子树高差的绝对值大于1,故不平衡)。
如图2-1-2所示:此时若观察以20为根节点的二叉树,不平衡,以36为根节点的子树也不平衡。
在这两种情况中,我们均选择最小的那棵不平衡的子树,即(36-45-77)
其根节点(36)作为最小不平衡子树的根节点,简称为最小失衡点。
注意:在一组旋转中最小平衡点是不变的
2.旋转中心节点(简称:旋转中心)
当最小失衡点选出后,一般情况下由该最小失衡点的左右某一个孩子作为其旋转中心(若最小失衡点的左子树高于右子树,则为最小失衡点的左孩子)。
注意:在LR、RL情况下旋转中心是会发生改变的
如图2-1-1和图2-1-2,旋转中心均为(45)。
三、旋转的几种情况
下列中最小平衡点用红色箭头标识,旋转中心用橙色箭头标识
1、单旋转(LL、RR)
LL旋转
如图3-1-1,由上述定义得,最小失衡点为20,则旋转中心为15,由根节点出发(1-2)判断其为LL型,则以旋转中心向左(L)旋转,如下图(3-1-2):
引用平衡二叉树的旋转中的动图:
点击查看动图
RR旋转
如图3-1-3,由上述定义得,最小失衡点为15,则旋转中心为20,由根节点出发(1-2)判断其为RR型,则以旋转中心向右(R)旋转,如下图(3-1-4):
引用平衡二叉树的旋转中的动图:
点击查看动图
2、双旋转(LR、RL)
双旋转的实质就是第一次现将子树旋转为单旋转的情况,然后实行一次单旋转即可。
LR旋转
如上图3-2-1所示,最小失衡点为20,旋转中心为10,首先带动与旋转中心连接的点(除最小失衡点外)转动,将树转动为图3-1-1的情况,然后进行一次LL单旋转即可(此次转动需带动最小失衡点):
注意,此时旋转中心从10变成了15,但最小失衡点未改变
旋转完成。
RL旋转
如上图3-2-2所示,最小失衡点为15,旋转中心为30,首先带动与旋转中心连接的点(除最小失衡点外)转动,将树转动为图3-1-3的情况,然后进行一次RR单旋转即可(此次转动需带动最小失衡点):
注意,此时旋转中心从30变成了20,但最小失衡点未改变
旋转完成。
3、多结点情况
若出现下图中的情况:
此时由前面的概念可以得出,最小失衡点为20,旋转中心为45,此时可以暂时先将图化简为下列情况:
得出:
然后,我们观察图例1,,,65是78的左子树,转动后78的左子树存在空位,则将65放置于该位置,15是20的左子树,转动后20的左子树存在空位,则将15放置于该位置,30是45的左子树,转动后45的左子树不存在空位,则将30放置于以45的左孩子为根的子树之中的适当位置即可:
完成。