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

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

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

如何定义红黑树是平衡,还是不平衡?

人很容易,看出上面这棵树是不平衡的,但是机器怎么判断当前的树是平衡的,还是不平衡的?红黑树用5个规则解决了这个问题,满足这5个规则,就是平衡。不满足这5个规则,就是不平衡。 这5个规则,都是清晰可执行的。

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

  • 规则一:节点是红色或黑色的;
  • 规则二:根节点是黑色的;
  • 规则三:每个叶子节点都是黑色的空节点(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的过程。
在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/zhangjin1120/article/details/121223501