红黑树理解(二) 插入过程图解

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树理解(二) 插入过程图解相关的知识,希望对你有一定的参考价值。

红黑树理解 (一) 从2-3树到红黑树
红黑树理解(二)插入过程图解
红黑树理解(三)变色

 本文主要讲解红黑树的插入过程,还有一些实际的细节,比如,左旋具体是怎么做的?右旋具体是怎么做的?这些后续再分析。
 在线动画演示红黑树:https://rbtree.phpisfuture.com/

红黑树的五个规则是什么?

  • 规则一:节点是红色或黑色的;
  • 规则二:根节点是黑色的;
  • 规则三:每个叶子节点都是黑色的空节点(NIL节点);
  • 规则四:每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不可能有两个连续的红色节点);
  • 规则五:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点;

插入的具体情况分析。

1.插入的节点是根节点

红黑树为空,插入的结点作为根节点。直接插入,标记为黑色。

2.插入的节点的父节点是黑色

 例如:原红黑树中,只有根节点,根节点本来就是黑色,这是再次插入新节点,新节点的父节点就是黑色。
 直接插入,标记为红色。
再举一个例子,下图中的红黑树,再插入一个数值为8的结点,直接将7的右子树赋值为8。

3.插入的节点的父节点是红色,叔叔节点也是红色

第一步:将父亲节点和叔叔节点都改为黑色,爷爷结点改为红色。
第二步:爷爷结点看具体情况,是否继续变为黑色。例如:爷爷结点是根节点,就需要再变为黑色。如下图:

下面这种情况,再插入结点8,爷爷结点就不用变色,保持红色就好。

4. 插入的节点的父节点是红色,叔叔节点是黑色。

将当前插入的结点命名为C,父节点命名为P,爷爷结点命名为G。分四种情况:

4.1 左左插入

P是G的左子树,C是P的左子树。
调整措施:G右旋,P变黑色,G变红色。

4.2 左右插入

左右:P是G的左子树,C是P的右子树。
调整措施:P左旋,然后重复4.1的步骤。

4.3 右右插入

右右:P是G的右子树,C是P的右子树。
调整措施:G左旋,G变红色,P变黑色。(如果G是根节点,也是一样的。)
下图显示的是插入25时,调整的过程。

4.4 右左插入

右左:P是G的右子树,C是P的左子树。
调整措施:P右旋,转为4.3的过程。
下图是插入23的过程。

非常感谢:
红黑树的原理 (插入+ 删除) 案例分析

以上是关于红黑树理解(二) 插入过程图解的主要内容,如果未能解决你的问题,请参考以下文章

红黑树的插入操作过程详细图解

红黑树理解 左旋

红黑树理解右旋

红黑树理解 (三)变色

HashMap底层红黑树原理(超详细图解)+手写红黑树代码

深入理解Java集合框架红黑树讲解(上)