平衡二叉树的旋转以及简便方法

我们两清 提交于 2019-12-18 23:00:05

刚开始听这个平衡二叉树的旋转,一听就蒙了,后来看了很多视频,有很多的说法。下面来介绍平衡二叉树

平衡二叉树:就是每个节点的平衡因子(Balance Factor)(以下简称BF)的绝对值小于等于1,即为0或1。

而BF就是每个节点左子树的高度减去右子树的高度。

平衡二叉树的旋转共有四种情况:

下面说一个定义,新插入的节点为破坏点,而由于破坏点的存在使二叉树失衡(|BF|>1)的节点为被破坏节点

    1.LL型:即为被破坏节点的左子树的左子树插入破坏节点。如图:

 

 数值为10的节点的左子树(数值为9的节点)的左子树(数值为8的节点),使其不平衡,而10为被破坏节点,8为破坏节点,那么LL即为10的L的9的L,后一个L为中心,顺时针旋转10节点(右旋),则得到:

 

     RR型:即为被破坏节点的右子树的右子树插入破坏节点。如图

 

 数值为10的节点的右子树(数值为11的节点)的右子树(数值为12的节点),使其不平衡,而10为被破坏节点,12为破坏节点,那么RR即为10的R的11的R,后一个R为中心,逆时针旋转10节点(左旋),则得到:

 

    LR型:即为被破坏节点的左子树的右子树插入破坏节点。如图:

 

 无论怎么旋转发现一次都不能完成,则需先将其转化为LL型(因为LR型第一个为L,所以转化为LL型,再按上面的步骤进行旋转),又因为LL为递减的顺序,所以6应该上去,5下来;

  1.转化为LL型:

 

 这样就构成了LL型,按上面的步骤进行二次旋转

  2.按LL型处理:

 

     RL型:即为被破坏节点的右子树的左子树插入破坏节点。如图:

 

 

先将其转化为RR型,因为RR型,从上往下为递增,因此需要将11向上,12向下,从而构造成,RR型;

  1.转化为RR型

 

   2.正常的RR旋转:

 

 注意:考试的题,二叉树会很复杂,也就是说你要正确的LR,RR,LL,RL对于哪个节点而言,这样你就会明白旋转的中心

旋转的操作都是对不平衡的最小子树,例如如果两个节点都不平衡,则先考虑深度大的节点,因为解决这个问题以后,可能深度小的也自然而然的解决了。

要解决旋转之后产生分支的何去何从,这是你要看分支在原图的位置,和其他点的大小关系,这样你就知道旋转之后,它要依附于哪个点

不管怎么操作都不能改变其中序遍历的顺序

 

认真的思考之后,不难发现,不论用什么方法,操作以后,都是让是三个点之中大小为中间的数做根,比中间数小的数,做根的左孩子,比中间数大的数,做根的右孩子,因此有一个简单的方法:

1.不管什么结构,从最深的叶子节点向上递归查找第一个失衡的点,标号为1.

2.再选1下面的点为2.

3.再选2下面的点为3.

4.不管什么结构,大小为中间的数做根,比中间数小的数,做根的左孩子,比中间数大的数,做根的右孩子

5.然后按照分支和每个点之间的关系,补全,这样就完成了。

 

 

例子:在如图所示的平衡二叉树中插入关键字48后得到一颗新的平衡二叉树,在新的平衡二叉树中,关键字37所在的节点的左右子节点中保存的关键字分别是:

 

 插入48之后如图:

 

 从下到上计算每个节点的BF;

BF(48)=0;    BF(37)=-1;    BF(90)=0;    BF(53)=1;    BF(13)=0;    BF(24)=-2;

发现失衡节点为24,那么24编号为1,又因为插入了48(所以造成失衡的路径应为24->53->37->48),所以2号节点为53,3号节点为37

将三个节点排序,则37为根节点,24为左孩子,53为右孩子,如图:

 

 再按原图的关系,补全图:53右孩子为90;49比37大比53小,所以48为53的右孩子;24的左孩子为13;如图:

 

 

可知答案为24 53;

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!