平衡二叉排序树–调整方法快速记忆方法
首先我们先了解下什么是平衡二叉排序树。
平衡二叉排序树又称AVL树。一棵平衡二叉排序树或者是空树,或者是具有下列性质的二叉排序树:
①左子树与右子树的高度之差的绝对值小于等于1。
②左子树和右子树也是平衡二叉排序树。
引入平衡二叉排序树的目的,为了提高查找效率,其平均查找长度为O(log2n).
结点的平衡因子( Balance Factor)定义为:结点的左子树深度与右子树深度之差。显然,对一棵平衡二叉排序树而言,其所有结点的平衡因子只能是-1、0或1.当在一个平衡二叉排序树上插入一个结点时,有可能导致失衡,即出现绝对值大于1的平衡因子。
比如:
数据结构–用C语言描述(第二版)
其次了解下需要调整的情况,一般情况下,只有新插入结点的祖先结点的平衡因子受影响,即以这些祖先结点为根的子树有可能失衡。下层的祖先结点恢复平衡,将使上层的祖先结点恢复平衡,因此应该调整最下面的失衡子树。因为平衡因子为0的祖先不可能失衡,所以从新插入结点开始向上,遇到的第一个其平衡因子不等于0的祖先结点为第一个可能失衡的结点,如果失衡,则应调整以该结点为根的子树。失衡的情况不同,调整的方法也不同。失衡类型及相应的调整方法可归纳为LL型、LR型、RR型、RL型四种。(LL型-RR型对称、LR型-RL型对称)
根据例子:
1.LL型
假设最低层失衡结点为A,在结点A的左子树的左子树插入新结点S后导致失衡,如图(a)所示。由A和B的平衡因子容易推知,BL、BR以及AR深度相同。为恢复平衡并保持二叉排序树特性,可将A改为B的右孩子,B原来的右孩子BR改为A的左孩子,如图(b)所示。这相当于以B为轴,对A做了一次顺时针旋转。
2.LR型
假设最低层失衡结点为A,在结点A的左子树的右子树插入新结点S后导致失衡,如图(a)所示。这里假设在C下插入S,如果是在CR下插入S,对树的调整方法相同,只是调整后A、B的平衡因子不同。由A、B、C的平衡因子容易推知,C1与C深度相同,B与AR深度相同,且B、AR的深度比C1、C的深度大1。为恢复平衡并保持二叉排序树特性,可首先将B改为C的左孩子,而C原来的左子C改为B的右孩子;然后将A改为C的右孩子,C原来的右孩子C改为A的左孩子,如图(b)示。这相当于对B做了一次逆时针旋转,对A做了一次顺时针旋转
说实话由于数据结构难度本来就大,时间少,看了这么多一时间也记不住。所以我在理解的基础上考虑怎么方便记住。于是“渣男丢妻弃子法”就诞生了。
第一步:找失衡点,判断失衡类型。
第二步:找渣男–从插入新节点S往上找,谁是S的爷爷结点失衡谁就是渣男
第三步:“渣男丢妻弃子法”
1、先定义下:L为妻,R为子,双为留,单为丢(弃)。也就是说LL为留下L(妻),RR为留下R(子),LR,RL为L、R都不要(丢弃妻子)
2、公式:
LL型–弃子留妻,渣男高升,右边接盘 (很简单哪边被丢弃了,哪边
RR型–丢妻留子,渣男高升,左边接盘 的根结点接盘)
LR型–丢妻弃子,渣男高升,左右接盘
RL型–丢妻弃子,渣男高升,左右接盘
例子:
LL型:
RL型:
好了,我们的“渣男丢妻弃子 ”介绍完了,希望对大家有所帮助,如果以上内容有错,望指正。
本文指导教材:
数据结构–用C语言描述(第二版)耿国华