本篇目录
****************************************************************************
红黑树的概念及性质
利用图示法介绍红黑树的插入是怎么实现的
*****************************************************************************
一、红黑树的基本性质
(1)、红黑树是在每个结点上增加一个存储位来保存节点颜色的一种二叉搜索树,保存颜色的存储位可以是黑色也可以是红色。
(2)、红黑树是接近平衡的。因为通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍。
(3)、每个节点包含五个域(如下图):
如果一个结点没有leftchild或者rightchild或者parent域,那就用NULL来表示。
(4)、红黑树的性质:
<1>、每个节点或是红的、或是黑的。 <2>、根结点是黑的。 <3>、每个叶结点是黑的。 <4>、如果一个结点是红的,则它的两个儿子都是黑的。 <5>、对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。 |
二、红黑树的插入是怎么实现的?
为了便于处理红黑树代码中的边界条件,采用一个哨兵来代表NULL,它的color域是黑的,其余parent、leftchild、rightchild、key域可设置成任意值。
先简单的画一颗树来说明一下几个”称呼“,结点颜色还没确定。
下面来讲一下红黑树的插入过程:
第一步:红黑树的结点插入默认是红色的。根结点始终为黑色。(黑色也可以,但是会增加路径上的黑色结点,很容易破坏性质五,调整很麻烦,所以选择红色)
第二步:插入红色结点,
2.1:如果父结点为黑色,红黑树性质继续保持,操作完成。
2.2:如果父结点为红色时,需要修正(破坏了性质4),
2.2.1:当叔父结点为红色时:将父结点和叔父结点变为黑色,祖父结点变为红色。由于有可能祖父结点的父结点有可能为红色,依旧会破坏红黑树的性质,此时需要将祖父结点作为新插入的结点继续向上迭代进行平衡操作,在迭代时如果调整到根,根依旧要保持为黑色结点。
2.2.2:当叔父结点为黑色时:需要进行旋转。
接着来用一组数据进行示例:
依次插入10,85,15,70,20,60,30,50,65,80,90,5,40,55这一组数。用画图的形式进行每一步的解释。(在下面插入过程中没有将哨兵结点画入,但是它是存在的!)注:绿色标注表示的是执行的上面的哪一步操作。
emmmmm,画完整个图之后现在眼里全是小红圈和小黑圈^w^.
最后由这一组数据形成的红黑树应该长成如下图这样:
红黑树的插入图示法就先讲到这。