平衡二叉树

一、平衡二叉树的定义


        平衡二叉树简称平衡树,又称AVL树。平衡二叉树的定义是:若一棵二叉树中每个结点的左、右子树的高度至多相差1,则称此树为平衡的。把二叉树中每个结点的左子树高度减去右子树高度定义为该结点的平衡因子。因此,平衡树中每个结点的平衡因子只能是1、0或-1。图7-10(a)就是一棵平衡二叉树,图(b)和(c)分别是一棵非平衡树,每个结点上方所标数字为该结点的平衡因子。



       

       虽然平衡树的平衡性比理想平衡树要差一些,但理论上已经证明:具有n个结点的平衡树的高度在任何情况下绝不会比具有相同结点数的理想平衡树高出45%以上。因此,在平衡树上进行查找运算虽然比理想平衡树要慢一些,但通常比任意生成的二叉排序树快得多,当然,其时间复杂度的数量级表示仍为O(log2n)。

       当向一棵平衡树插入一个新结点时,若插入后结点的左、右子树的高度不变,则不会影响这些结点的平衡因子,因此也不会因为这些结点造成不平衡;若插入后某些结点在左子树高度增1(右子树高度增1的情况与之类似),则会影响这些结点的平衡因子,具体又分为3中情况:

      (1)若插入前一部分结点的左子树高度hL与右子树高度hR相等,即平衡因子为0,则插入后将使平衡因子变为1,但仍符合条件,不必为它们加以调整。

      (2)若插入前一部分结点的hL小于hR,即平衡因子为-1,则插入后将使平衡因子变为0,平衡更加改善,不必为他们进行调整。

      (3)若插入前一部分结点的hL大于hR,即平衡因子为1,则插入后将使平衡因子变为2,破坏了平衡树的限制条件,需要对他们加以调整,使整个二叉搜索树恢复为平衡树。

       若插入后,某些结点的右子树高度增1,则也分为相应的3种情况,对于第(1)种情况,平衡因子将由0变为-1,不必进行调整;对于第(2)种情况,平衡因子由-1变为-2,则必须对它们进行调整;对于第(3)种情况,平衡因子由1变为0,平衡更加改善,也不必进行调整。

       假定向平衡树中插入一个结点后破坏了其平衡性,则首先要找出唯一一个最小不平衡子树,然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当然,要使调整后该子树的二叉搜索树性质不变,即调整前后得到的中序序列要完全相同。稍后便知,最小不平衡子树被调整为平衡子树后,原有其他所有不平衡子树无须调整,整个二叉搜索树就又称为了一棵平衡树。

       所谓最小不平衡子树,是指以离插入结点最近,且平衡因子绝对值大于1的结点做根的子树。例如,在图7-10(b)中,以值30的结点做根的子树是该树的最小不平衡子树,分别以20和36做根的不平衡子树不是最小不平衡子树;在图7-10(c)中,以值为32的结点做根的子树是该树的最小不平衡子树,当然它也是唯一一个不平衡子树。


二、平衡二叉树的调整


1、LL型调整操作

       它是因在A结点的左(Left)孩子(假定用B表示)的左(Left)子树上插入结点,使得A结点的平衡因子由1变为2而引起的不平衡所进行的调整操作。调整过程如图7-11所示,图中用长方框表示子树,用长方框的高度表示子树的高度,用带阴影的小方框表示被插入的结点。图7-11(a)为插入前的平衡子树,aa,bb和cc的子树高度均为h(h>=0,若h=0,则它们均为空树),A结点和B结点的平衡因子分别为1和0。图7-11(b)为在B的左子树aa上插入一个新结点,使以A为根的子树成为最小不平衡子树的情况。图7-11(c)为调整后成为新的平衡子树的情况。调整规则是:将A的左孩子B向右上旋转代替A成为原不平衡子树的根结点,将A结点向右下旋转成为B的右子树的根结点,而B的原右子树bb则作为A结点的左子树。此调整过程需要修改3个指针,如图7-11(c)中的箭头所示:一是将原指向结点A的指针修改为指向结点B;二是将B的右指针修改为指向结点A;三是将A在左指针修改为指向B的原右子树树的根结点。另外,还需要修改A和B结点的平衡因子,应均被置为0。



      

       从图7-11可以看出,调整前后对应的中序序列相同。所以经这样调整后既恢复为平衡树,又保持了二叉搜索树的性质不变。

2、RR型调整操作

       它是因在A结点的右孩子(假定用B表示)的右子树上插入结点,使得A结点的平衡因子由-1变为-2而引起的不平衡所进行的调整操作。调整过程如图7-13所示。图7-13(a)为插入前的平衡子树,aa,bb,cc子树的高度相同,均为h(h>=0),A结点和B结点的平衡因子分别为-1和0;图7-13(b)为在B结点的右子树cc上插入一个新结点,使以A为根的子树成为最小不平衡子树的情况;图7-13(c)为调整后重新恢复平衡的情况,调整规则是:将A的右孩子B向左上旋转代替A成为原最小不平衡子树的根结点,将A结点向左下旋转成为B在左子树的根结点,而B的原左子树bb则作为A结点的右子树。此调整过程同LL型调整过程对称,要修改的3个指针如图7-13(c)中的箭头所示。同样,进行RR型调整前后,仍保持着二叉搜索树的性质不变,得到的中序遍历次序不变。(下图的下标7-13写成了7-11)




3、LR型调整操作

      它是因A结点的左孩子(假定用B表示)的右子树上插入结点,使得A结点的平衡因子由1变为2而引起的不平衡所进行的调整操作。调整过程如图7-14所示。图7-14(a)为插入前的平衡子树,bb和cc子树的高度均为h(h>=0),aa和dd子树的高度均为h+1,特别地若aa和dd子树为空树时,则B结点的右子树也同时为空,此时C结点将是被插入的新结点。插入前A结点和B结点的平衡因子分别为1和0,若C结点存在,则C结点的平衡因子为0。图7-14(b)为在B结点的右子树上插入一个新结点(当B的右子树为空时,则为C结点,否则为C的左子树或右子树上带阴影的结点,图中给出在左子树bb上插入的情况,若在右子树bb上插入,情况类似)使得以A为根的子树成为最小不平衡子树的情况,此处A结点和B结点的平衡因子是按相反方向变化的。而不像前两种调整操作那样,都是按同一方向变化的。图7-14(c)为调整后的情况。调整规则是:将A的左孩子的右子树的根结点C提升到A结点的位置;将B结点作为C的左子树的根结点,而C结点的原左子树bb则作为B结点的右子树;将A结点作为C的右子树的根结点,而C结点的原右子树则作为A结点的左子树。此调整过程比前两种复杂。需修改5个指针,如图7-14(c)中的箭头所示。




4、RL型调整(自行分析)

       在上述每一种调整操作中,以A为根的最小不平衡子树的高度在插入结点前和调整后相同,因此对其所有祖先结点的平衡性不会产生任何影响,即原有的平衡因子不变。故按照上述方法将最小不平衡子树调整为平衡子树后,整个二叉搜索树就成为了一棵新的平衡树。

       在二叉搜索树的插入和删除运算中,采用平衡树的优点是:使树的结构较好,从而提高查找运算的速度;缺点是:使插入和删除运算变得复杂化,从而降低它们的运算速度。因为在每次插入或删除运算中,不仅要进行插入和删除结点的操作,而且要检查是否存在最小不平衡子树,若存在,则需要对最小不平衡子树中有关指针进行修改。因此,平衡树适用于那种对二叉搜索树一经建立就很少进行插入和删除运算,而主要进行查找运算的应用场合。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值