【平衡二叉树的平衡调整-----------理论】

发布于:2024-10-17 ⋅ 阅读:(12) ⋅ 点赞:(0)

1平衡二叉树的基本概念

1.1回顾二叉排序树的查找

在这里插入图片描述
由于形态不均匀的二叉排序树查找效率不高,为了解决这个问题,我们引入了平衡二叉树

1.2平衡二叉树的定义

在这里插入图片描述

1.3平衡二叉树的 平衡因子(BF)

在这里插入图片描述
在这里插入图片描述
分为3种情况:
根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只能是以下三种情况
-1:结点左子树的高度 小于 结点右子树的高度
0:结点左子树的高度 等于 结点右子树的高度
1:结点左子树的高度 大于 结点右子树的高度

以下是两个实例:
在这里插入图片描述
计算如下:
在这里插入图片描述

在这里插入图片描述

2.平衡调整方法:

当我们在一个平衡二叉排序树上插入一个结点时有可能导致失衡,即出现平衡因子绝对值大于1的结点,如:2、-2.

比如:
在这里插入图片描述
如果在一颗AVL树中插入一个新结点后造成失衡,则必须重新调整树的结构,使之恢复平衡

2.1平衡调整的四种类型:

2.1.1引入:

在这里插入图片描述
如上图所示:

A:失衡结点不止一个失衡结点时,为最小失衡子树的根结点
(比如右边那棵树:结点7开始的失衡子树共有5个结点,而从16开始的失衡子树共有3个结点,此时失衡结点为16)

B: A(失衡结点)的孩子,C(新插入结点的双亲)
C: 插入新结点的子树新插入的结点是C结点

2.1.2平衡调整的四种类型 与手动计算调平后的失衡子树结构:

在这里插入图片描述

2.1.2.1 根据A、B、C的关系确定失衡类型

LL(Left-Left)型失衡

  • 描述:在插入或删除节点后,新插入的节点位于失衡节点的左孩子的左子树上(可以是失衡结点左子树的左子树旳根),导致该失衡节点左子树比右子树高2
  • 解决:通过一次右旋操作来恢复平衡。

RR(Right-Right)型失衡
描述:在插入或删除节点后,新插入的节点位于失衡节点的右孩子的右子树上(可以是失衡结点左子树的左子树旳根),导致该失衡节点右子树比左子树高2。
解决:通过一次左旋操作来恢复平衡。

LR(Left-Right)型失衡

  • 描述:在插入或删除节点后,新插入的节点位于失衡节点的左孩子的右子树上(可以是失衡结点左子树的右子树旳根),导致该失衡节点的左子树比右子树高1。
  • 解决:首先对失衡节点的左子节点进行左旋操作,然后对失衡节点进行右旋操作来恢复平衡。

RL(Right-Left)型失衡

  • 描述:在插入或删除节点后,新插入的节点位于失衡节点的右孩子的左子树上(可以是失衡结点右子树的左子树旳根),导致该失衡节点的右子树比左子树高1。
  • 解决:首先对失衡节点的右子节点进行右旋操作,然后对失衡节点进行左旋操作来恢复平衡。
2.1.2.2直接获得调平树的手动计算方法

调整原则:
(1)降低高度:
(2)保持二叉排序树的性质

获得插入后平衡结构的核心方法为:

  • 定根:中序遍历失衡子树,其中中间结点为调整后的根结点
  • 定左孩子:为失衡子树中序遍历后中间结点前驱
  • 定右孩子:为失衡子树中序遍历后中间结点后继

同样以上述四种基本类型进行实例分析:
在这里插入图片描述

2.1.2.3调整平衡的一般方法
2.1.2.3.1根据失衡结点与其左右孩子结点的平衡因子来判断失衡类型

在这里插入图片描述
分析如下:

  • ①失衡结点平衡因子等于2:证明左子树高于右子树,故为L ?

  • [1]左孩子平衡因子为1:证明左孩子的左子树高于右子树,故为LL

  • [2]左孩子平衡因子为-1:证明左孩子的左子树低于右子树,故为LR


  • ②失衡结点平衡因子等于-2:证明左子树低于右子树,故为R ?

  • [1]左孩子平衡因子为1:证明左孩子的左子树高于右子树,故为RL

  • [2]右孩子平衡因子为-1:证明右孩子的左子树低于右子树,故为RR

2.1.2.4左旋转:操作对象为RR型

核心操作:冲突的左孩变为右孩

实例1(直接旋转的实例):
在这里插入图片描述
在这里插入图片描述
调平好的平衡二叉树与原失衡的平衡二叉树中序遍历序列等价
在这里插入图片描述

实例2:(冲突的左孩子变为右孩子)
若旋转的失衡结点同时有左右孩子
则在左旋转的过程中,由之前的定根方法,
我们发现:新的根结点(失衡结点的右孩子)的左孩子与旋转结点的左孩子发生了冲突,
此时应该将新的根结点的左孩子作为
旋转后的失衡结点的右孩子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
调平好的平衡二叉树与原失衡的平衡二叉树中序遍历序列等价
在这里插入图片描述

2.1.2.5右旋转:操作对象为LL型

核心操作:冲突的右孩变为左孩

实例1(直接旋转的实例):

在这里插入图片描述
在这里插入图片描述
调平好的平衡二叉树与原失衡的平衡二叉树中序遍历序列等价
在这里插入图片描述
实例2:(冲突的右孩子变为左孩子)与左旋十分类似
则在右旋转的过程中,由之前的定根方法,
我们发现:新的根结点(失衡结点的左孩子)的右孩子与旋转结点的右孩子发生了冲突,
此时应该将新的根结点的右孩子作为
旋转后的失衡结点的左孩子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
调平好的平衡二叉树与原失衡的平衡二叉树中序遍历序列等价
在这里插入图片描述

小结:
在这里插入图片描述

2.1.2.6左旋左孩子,然后右旋:操作对象为LR型

(插入结点在失衡结点的左孩子的右子树上)

实例1:左旋孩子时(注意冲突的左孩变右孩),右旋失衡结点时(注意冲突的右孩变左孩)

【1】左旋左孩子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
【2】右旋失衡结点:
在这里插入图片描述
在这里插入图片描述

2.1.2.7右旋右孩子,然后左旋:操作对象为RL型

(插入结点在失衡结点的右孩子的左子树上)

实例1:右旋孩子时(注意冲突的右孩变左孩),左旋失衡结点时(注意冲突的左孩变右孩)

【1】右旋孩子结点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【2】左旋失衡结点:
在这里插入图片描述
在这里插入图片描述

2.1.2.8二叉平衡树的插入注意事项:

在这里插入图片描述
实例如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1.2.9二叉平衡树的删除结点注意事项:

删除结点后,可能不止会调整一次失衡,故需要依次沿着祖先,依次向上检查调整
在这里插入图片描述