《数据结构(C语言版)第二版》第七章-查找(7.3.2 平衡二叉树和红黑树)

⭐7.3.2 平衡二叉树

合集·数据结构(精美动画演示讲解) —— 平衡二叉树(AVL树) —— 蓝不过海呀

一秒学会 平衡二叉树的调整,非标题党!不简单你打我! (考研数据结构)—— 公台所言极是

讲解平衡二叉树的实现(C语言)—— 尘封的时间

左旋(逆时针旋转)

以(失衡)结点4的右子树根结点7为支点,将(失衡)结点4左旋(逆时针旋转)。
如果该支点7有左孩子,则将其变为旋转结点4的右孩子。

在这里插入图片描述

以(失衡)结点5的右子树根结点9为支点,将(失衡)结点5左旋(逆时针旋转)。
如果该支点9有左孩子6,则将其变为旋转结点5的右孩子。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

右旋(顺时针旋转)

以(失衡)结点10的左子树根结点7为支点,将(失衡)结点10右旋(顺时针旋转)。
如果该支点7有右孩子,则将其变为旋转结点10的左孩子。

在这里插入图片描述

以(失衡)结点14的左子树根结点6为支点,将(失衡)结点14右旋(顺时针旋转)。
如果该支点6有右孩子9,则将其9变为旋转结点14的左孩子。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

旋转操作

在这里插入图片描述

LL型失衡及平衡操作(分两种情况)

(1)失衡原因:由于在 结点A-31 左子树根结点B-25的左子树BL(原来为空)上插入结点BL-16,结点A-31 的平衡因子由 1 增至 2, 致使以 结点A-31 为根的子树失去平衡。

平衡操作:需对 失衡结点A-31 进行一次右旋(顺时针旋转)操作。
以失衡结点A-31 的左子树根结点B-25 为支点,将失衡结点A-31 右旋(顺时针旋转)。
如果该支点B-25 有右孩子,则将其变为旋转结点A-31 的左孩子。
【如果该支点B-25 有左孩子BL-16,则其BL-16 仍为该支点B-25 的左孩子。如下图的情况。】
在这里插入图片描述

(2)失衡原因:由于在结点14左子树根结点6的左子树5上插入结点3,结点14的平衡因子由 1 增至 2, 致使以 结点14 为根的子树失去平衡。

平衡操作:需对 失衡结点14 进行一次右旋(顺时针旋转)操作。
以失衡结点14的左子树根结点6为支点,将失衡结点14右旋(顺时针旋转)。
如果该支点6有右孩子9,则将其9变为旋转结点14的左孩子。

在这里插入图片描述
在这里插入图片描述

【 不分类时,凡是满足失衡结点平衡因子为2,失衡结点左孩子的平衡因子为1的 都属于LL型。
平衡操作 还是需对 失衡结点 进行一次右旋(顺时针旋转)操作。 】

RR型失衡及平衡操作(分两种情况)

(1)失衡原因:
由于在结点31 的右子树根结点47 的**右子树(原来为空)**上插入结点69,结点31的平衡因子由-1 变为-2,致使以 结点31 为根结点的子树失去平衡。

平衡操作:需对 失衡结点31 进行一次左旋(逆时针旋转)。
以失衡结点31 的右子树根结点47 为支点,将失衡结点31 左旋(逆时针旋转)。
如果该支点47 有左孩子,则将其变为旋转结点31 的右孩子。
【如果该支点47 有右孩子69 ,则其69 仍为该支点47 的右孩子。如下图的情况。】
在这里插入图片描述

(2)失衡原因:由于在结点5的右子树根结点9的右子树14上插入结点17,结点5的平衡因子由-1 变为-2,致使以 结点5 为根结点的子树失去平衡。

平衡操作:需对 结点5 进行一次左旋(逆时针旋转)。
以失衡结点5的右子树根结点9为支点,将失衡结点5左旋(逆时针旋转)。
如果该支点9有左孩子6,则将其6变为旋转结点5的右孩子。

在这里插入图片描述
在这里插入图片描述

【 不分类时,凡是满足失衡结点平衡因子为-2,失衡结点右孩子的平衡因子为-1的 都属于RR型。
平衡操作 还是需对 失衡结点 进行一次左旋(逆时针旋转)。 】

LR型失衡及平衡操作(分三种情况)

(1)LR(0)型
失衡原因:由于在 结点31 的左子树根结点25 的**右子树(原来为空)**上插入结点28, 结点31 的平衡因子由1增至2, 致使以 结点31 为根结点的子树失去平衡。

平衡操作:需进行两次旋转操作。第一次对失衡结点31的左子树25 进行左旋(逆时针旋转),第二次对失衡结点31 进行一次右旋(顺时针旋转)操作,即可恢复平衡。
①先对失衡结点的左子树(平衡因子为-1,并不是失衡结点)进行左旋:
在图中第二棵树,以失衡结点31左子树25 的右子树根结点28为支点,将失衡结点31的左子树25 左旋(逆时针旋转)。
如果该支点28有左孩子,则将其变为旋转结点25的右孩子。
【旋转后,下图第二棵树中结点31不变(与结点25的连线断开),结点25成为根结点28的左子树。根结点28成为结点31的左子树。以结点31 为根结点的子树仍然是不平衡的。(如红色第三棵树)】
②右旋失衡结点本身
以失衡结点31 的左子树根结点28 为支点,将失衡结点31右旋(顺时针旋转)。
如果该支点28有右孩子,则将其变为旋转结点31的左孩子。
【旋转后即为下图第四棵树。】
在这里插入图片描述

【区别 LL型失衡的第一种情况 】
在这里插入图片描述

(2)LR(L)型
失衡原因:由于在 结点9 的左子树根结点5的右子树8的**左子树(原来为空)**上插入结点6, 结点9 的平衡因子由1增至2, 致使以 结点9 为根结点的子树失去平衡。

平衡操作:需进行两次旋转操作。第一次对失衡结点9的左子树5 进行左旋(逆时针旋转),第二次对失衡结点9 进行一次右旋(顺时针旋转)操作,即可恢复平衡。
①先对失衡结点的左子树(平衡因子为-1,并不是失衡结点)进行左旋:
以失衡结点9左子树5的右子树根结点8为支点,将失衡结点9的左子树5 左旋(逆时针旋转)。
如果该支点8有左孩子6,则将其6变为旋转结点5的右孩子。【前两张图】
②右旋失衡结点本身
以失衡结点9的左子树根结点8为支点,将失衡结点9右旋(顺时针旋转)。
如果该支点8有右孩子,则将其变为旋转结点9的左孩子。【后两张图】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)LR(R)型
失衡原因:由于在 结点31 的左子树根结点25的右子树28的**右子树(原来为空)**上插入结点30, 结点31 的平衡因子由1增至2, 致使以 结点31 为根结点的子树失去平衡。

平衡操作:需进行两次旋转操作。第一次对失衡结点31的左子树25 进行左旋(逆时针旋转),第二次对失衡结点31 进行一次右旋(顺时针旋转)操作,即可恢复平衡。
①先对失衡结点的左子树(平衡因子为-1,并不是失衡结点)进行左旋:
在图中第二棵树,以失衡结点31左子树25 的右子树根结点28为支点,将失衡结点31的左子树25 (连带其左子树16)左旋(逆时针旋转)。
如果该支点28有左孩子,则将其变为旋转结点25的右孩子。
【旋转后,下图第二棵树中结点31不变(与结点25的连线断开),结点25成为根结点28的左子树。根结点28成为结点31的左子树。以结点31 为根结点的子树仍然是不平衡的。(如红色第三棵树)】
②右旋失衡结点本身
以失衡结点31 的左子树根结点28 为支点,将失衡结点31(连带其右子树47)右旋(顺时针旋转)。
如果该支点28有右孩子30,则将30其变为旋转结点31的左孩子。
【旋转后即为下图第四棵树。】
在这里插入图片描述

【 不分类时,凡是满足失衡结点平衡因子为2,失衡结点左孩子的平衡因子为-1的 都属于LR型。
平衡操作 还是需进行两次旋转。第一次对失衡结点的左子树 进行左旋(逆时针旋转),第二次对失衡结点进行一次右旋(顺时针旋转)操作,即可恢复平衡。 】

RL型失衡及平衡操作(分三种情况)

(1)RL(0)
失衡原因:由于在 结点31 的右子树根结点47 的**左子树(原来为空)**上插入结点40,结点31 的平衡因子由-1 变为-2,致使以 结点31 为根结点的子树失去平衡。

平衡操作:需进行两次旋转操作。第一次对失衡结点31 的右子树47 进行右旋(顺时针旋转),第二次对失衡结点31 进行一次左旋(逆时针旋转)操作,即可恢复平衡。
①先对失衡结点的右子树(平衡因子为1,并不是失衡结点)进行右旋:
以失衡结点31 右子树47 的左子树根结点40 为支点,将失衡结点31 的右子树47 右旋(顺时针旋转)。
如果该支点40 有右孩子,则将其变为旋转结点47的左孩子。【旋转过后的图没画】
②左旋失衡结点本身
以失衡结点31的右子树根结点40为支点,将失衡结点31左旋(逆时针旋转)。
如果该支点40有左孩子,则将其变为旋转结点31的右孩子。
在这里插入图片描述

【区别 RR型失衡的第一种情况 】
在这里插入图片描述

(2)RL(L)

失衡原因:由于在 结点31 的右子树根结点47 的左子树40 的**左子树(原来为空)**上插入结点36,结点31 的平衡因子由-1 变为-2,致使以 结点31 为根结点的子树失去平衡。

平衡操作:需进行两次旋转操作。第一次对失衡结点31 的右子树47 进行右旋(顺时针旋转),第二次对失衡结点31 进行一次左旋(逆时针旋转)操作,即可恢复平衡。
① 先对失衡结点的右子树(平衡因子为1,并不是失衡结点)进行右旋:
以失衡结点31右子树47的左子树根结点40为支点,将失衡结点31的右子树47(连带其右子树69) 右旋(顺时针旋转)。
如果该支点40有右孩子,则将其变为旋转结点47的左孩子。【旋转过后的图没画】
② 左旋失衡结点本身
以失衡结点31的右子树根结点40为支点,将失衡结点31(连带其左子树25)左旋(逆时针旋转)。
如果该支点40有左孩子36,则将其36变为旋转结点31的右孩子。
在这里插入图片描述

(3)RL(R)
失衡原因:由于在 结点5 的右子树根结点9的左子树6的**右子树(原来为空)**上插入结点8,结点5 的平衡因子由-1 变为-2,致使以 结点5 为根结点的子树失去平衡。

平衡操作:需进行两次旋转操作。第一次对失衡结点5的右子树9 进行右旋(顺时针旋转),第二次对失衡结点5 进行一次左旋(逆时针旋转)操作,即可恢复平衡。
① 先对失衡结点的右子树(平衡因子为1,并不是失衡结点)进行右旋:
以失衡结点5右子树9的左子树根结点6为支点,将失衡结点5的右子树9 右旋(顺时针旋转)。
如果该支点6有右孩子8,则将其8变为旋转结点9的左孩子。【前两张图】
② 左旋失衡结点本身
以失衡结点5的右子树根结点6为支点,将失衡结点5左旋(逆时针旋转)。
如果该支点6有左孩子,则将其变为旋转结点5的右孩子。【后两张图】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【 不分类时,凡是满足失衡结点平衡因子为-2,失衡结点右孩子的平衡因子为1的 都属于RL型。
平衡操作 还是需进行两次旋转。第一次对失衡结点 的右子树 进行右旋(顺时针旋转),第二次对失衡结点 进行一次左旋(逆时针旋转)操作,即可恢复平衡。 】

四种失衡情况判断及平衡操作

【直接根据失衡结点及其左/右孩子的 平衡因子,判断属于哪一种类型即可,
不用考虑插入前后结点是否为空,或者插入的是左子树还是右子树,也不用考虑插入结点距离失衡结点有多远。】

在这里插入图片描述

⭐【红黑树】

红黑树和平衡二叉树的区别

(1)平衡二叉树(AVL)的左右子树的高度差绝对值不超过1,严格保持平衡,只要不平衡就需要通过复杂的旋转操作来维护平衡,适用于插入与删除次数较少的情况。
(2)红黑树追求大致平衡(平衡性介于二叉排序树BST和AVL之间),左右子树的高度差在某些时刻可能会超过1,但只要符合红黑树的五个条件即可。
红黑树不符合自身定义的规则时,有些情况只通过颜色和一系列规则来维护平衡,即只改变颜色不用旋转,就能达到平衡。
红黑树其实现简单且性能良好,适用于大量数据的快速查找、插入和删除操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值