数据结构之平衡二叉树

来源:互联网 发布:nfs网络文件系统 编辑:程序博客网 时间:2024/04/28 17:48

平衡二叉树产生的原因

    平衡二叉树源于二叉排序树,由二叉排序树的查找算法可知在数据的分布越分散或者说越均匀时,其算法的查找效率(时间复杂度)越好。这里可能不太好理解所谓的二叉排序树的分布情况,请看下图:
      图一中的二叉排序树的右字数都为空,则此形态下的查找算法的时间复杂度和线性表一致。而图二中的二叉排序树在形态上分布是均匀的则其查找算法的时间复杂度就要由于图一。为了保证二叉排序树不出现极端的情况,因此就提出了平衡二叉树的概念。

概念

    平衡二叉树又称为AVL数,它或者是一棵空树或者是具有如下性质的二叉树:它的左右子树都是平衡二叉树,且左、右子树的高度差的绝对值不超过1。所谓的高度差呢,就是深度差。直白的说就像商贩卖水果,多重的水果就用多重的秤砣。一定要保持平衡才可以,不管是买家还是买家都不愿意吃亏的。

平衡二叉树旋转

    平衡二叉树的插入操作,必定要破坏之前的平衡。秤好的一斤水果,不论你加水果还是加秤砣平衡一定要遭到破坏。那么为了保证其平衡,我们在插入操作后就需要对新的二叉树做一些处理,让二叉树恢复平衡,即旋转。旋转有四种形式,下面就先对应看看实例,之后予以说明。

     LL型(单向右旋)       

     RR型(单向左旋)

     LR型(先右后左)

  

     RL型(先左后右)


      旋转的目的是为了恢复插入的新节点而破坏了的平衡。从图中大概应该能看出来具体的思路。单一旋转理解起来比较简单,就像找一段线段的中点,当线段在哪一边延长中点就会往哪边移动。由此可见,旋转的重点是找到被破坏的平衡点(线段中点),和破坏平衡的子树(线段延长方向)。
    然后我们来看看符合型的旋转,以RL型实例为例,插入新节点28时,30这个节点的平衡遭到破坏,其左子树的节点深度为3而右子树深度为1。这时,我们进行单一右旋将中心移到20这个节点,平衡还是被破坏的。这时因为,此时新节点28离20的高度还是为3,也就是说单一右旋并没有改变新节点和中点的高度差。那么我们就需要先对其左旋使得新节点与中心点的高度差为2,然后在此右旋,大功告成了就。

2 0