21.第26章:平衡二叉树

2018-02-01  本文已影响0人  Ching_Lee

结点的平衡因子:该结点的右子树高度减去左子树高度。
如果结点的平衡因子为-1(左偏重)、0或者1(有偏重),那么这个结点是平衡的。

AVL树中插入或删除操作与普通二叉查找树相同,不同的是必须在插入或者删除操作之后进行重新平衡。

1). 左子树过高

a) LL型

在LL型的不平衡树中,我们首先找到最小不平衡子树,再以其根结点向右旋转。为何是向右旋转呢?应该不难理解,向右旋转后,相当于右边的子树树高增加了1,而左边的子树树高降低了1,而原本的树高之差为2,那么就能够将根的平衡因子就化为0。旋转之后为“原来根结点的左孩子作为新的根结点”。

我们对树以根结点为中心,向右旋转。旋转步骤如下:

  i.   将2作为根结点
 ii.   将3作为2的右孩子
iii.   将2的右孩子作为3的左孩子(维护树的有序性,只是此处为NULL而已)
b) LR型

对于LR,要分为两步进行旋。旋转之后为“原来根结点的左孩子的右孩子作为新的根结点”。

第一:(转换成LL型)
以较高子树的根,即1,为中心向左旋转。具体步骤如下。

 i. 将2的左子树作为1的右子树(维护树的有序性,只是此处为NULL而已)
 ii.  将1作为2的左子树
 iii.  将2作为3的左子树

第二:和LL型处理方式相同
以原树的根,即3为中心,向右旋转。最后结果如下


2). 右子树过高

a) RR型

还是引用一下之前的例子。旋转的步骤如下。旋转之后为“原来根结点的右孩子作为新的根结点”。

i.  将2作为根结点
ii.  将1作为2的左孩子
iii.  将2的左孩子作为1的右孩子(维护树的有序性,只是此处为NULL而已)
b)RL型

与LR型类似,我们需要进行两次旋转。旋转之后为“原来根结点的右孩子的左孩子作为新的根结点”。

第一,转换成RR型
以根结点的右孩子即3为中心向右旋转,结果如下。具体步骤如下

 i.  将2作为1的右孩子
 ii.  将3作为2的右孩子
iii.   将2的右孩子作为3的左孩子(维护树的有序性,只是此处为NULL而已)

第二,与RR型处理方式相同
以原根结点即1,作为中心,向左旋转。结果如下。具体步骤如下

 i.   将2作为根结点
 ii.   将1作为2的左孩子
 iii.   将2的左孩子作为1的右孩子(维护树的有序性,只是此处为NULL而已)

3.设计平衡二叉树

4.AVL树时间复杂度分析

上一篇下一篇

猜你喜欢

热点阅读