关于红黑树(R-B tree)原理,看这篇如何 (2)

  从规则4中知道,当前红黑树中从根节点到每个叶子节点的黑色节点数量是一样的,此时假如新的黑色节点的话,必然破坏规则,但加入红色节点却不一定,除非其父节点就是红色节点,因此加入红色节点,破坏规则的可能性小一些,下面我们也会举例来说明。

什么情况下,红黑树的结构会被破坏呢?破坏后又怎么维持平衡,维持平衡主要通过两种方式【变色】和【旋转】,【旋转】又分【左旋】和【右旋】,两种方式可相互结合。

下面我们从插入和删除两种场景来举例说明

三. 红黑树节点插入

当我们插入值为66的节点时,红黑树变成了这样

关于红黑树(R-B tree)原理,看这篇如何

很明显,这个时候结构依然遵循着上述6大规则,无需启动自动平衡机制调整节点平衡状态;

如果再向里面插入值为51的节点呢,这个时候红黑树变成了这样

关于红黑树(R-B tree)原理,看这篇如何

很明显现在的结构不遵循规则 4 了,这个时候就需要启动自动平衡机制调整节点平衡状态

3.1 变色

我们可以通过变色的方式,使结构满足红黑树的规则

首先解决结构不遵循规则 4 这一点(红色节点相连,节点49-51),需将节点49改为黑色;

此时我们发现又违反了规则5(56-49-51-XX路径中黑色节点超过了其他路径),那么我们将节点45改为红色节点;

哈哈,妹的,又违反了规则4(红色节点相连,节点56-45-43),那么我们将节点56和节点43改为黑色节点;

但是我们发现此时又违反了规则5(60-56-XX路径的黑色节点比60-68-XX的黑色节点多),因此我们需要调整节点68为黑色;

完成!!

关于红黑树(R-B tree)原理,看这篇如何

最终调整完成后的树为:

关于红黑树(R-B tree)原理,看这篇如何

但并不是什么时候都那么幸运,可以直接通过变色就达成目的,大多数时候还需要通过旋转来解决。

如在下面这棵树的基础上,加入节点65.

关于红黑树(R-B tree)原理,看这篇如何

插入节点65后进行以下步骤

关于红黑树(R-B tree)原理,看这篇如何

这个时候,你会发现对于节点64无论是红色节点还是黑色节点,都会违反规则5,路径中的黑色节点始终无法达成一致,这个时候仅通过【变色】已经无法达成目的。我们需要通过旋转操作,当然【旋转】操作一般还需要搭配【变色】操作。

旋转包括【左旋】和【右旋】,

左旋:

逆时针旋转两个节点,让一个节点被其右子节点取代,而该节点成为右子节点的左子节点

左旋操作步骤如下:

首先断开节点PL与右子节点G的关系,同时将其右子节点的引用指向节点C2;然后断开节点G与左子节点C2的关系,同时将G的左子节点的应用指向节点PL

关于红黑树(R-B tree)原理,看这篇如何

右旋:

顺时针旋转两个节点,让一个节点被其左子节点取代,而该节点成为左子节点的右子节点

右旋操作步骤如下:

首先断开节点G与左子节点PL的关系,同时将其左子节点的引用指向节点C2;然后断开节点PL与右子节点C2的关系,同时将PL的右子节点的应用指向节点G

关于红黑树(R-B tree)原理,看这篇如何

无法通过变色而进行旋转的场景分为以下四种:

3.2 左左节点旋转

这种情况下,父节点和插入的节点都是左节点,如下图(旋转原始图1)这种情况下,我们要插入节点65

规则如下:以祖父节点【右旋】,搭配【变色】

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjdgz.html