前言
有篇介绍红黑树起源,插入和查询的文章,介绍比较详细,就不重复介绍原理了。先贴上路径://www.greatytc.com/p/37c845a5add6,等详细研究或有所感悟后,在补充完善本文。
杂记
1. 2-3-4树
2-3-4树的名字是根据子节点数来确定的。如下是2-3-4树的key的种类。
- 2-node: one key, two children. (一个key值,两个儿子节点)
- 3-node: two keys, three children. (两个key值,三个儿子节点)
- 4-node: three keys, four children. (三个key值,四个儿子节点)
特性:4-node只能存在于最底层节点
效率:
- 最坏情况,所有节点为2-node,此时2-3-4树演变为完全平衡树,高度为lgN;
- 最好情况,所有节点为4-node(实际不存在),高度为log4N=1/2lgN;
- 当数据在100w个节点时,2-3-4树高度大约在10~20之间,可见要查询某个节点,最多只需要遍历20次。
2. 红黑树
红黑树的特性:
(1)每个节点或者是黑色,或者是红色;
(2)根节点是黑色;
(3)每个叶子节点(NIL)是黑色;(注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!)
(4)如果一个节点是红色的,则它的子节点必须是黑色的;
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
红黑树旋转:
数据插入步骤:
(1)按平衡二叉树的方式查找数据应该插入的位置;
由于红黑树首先是二叉树,所以插入也是先按照二叉树的插入规则查找插入点。
(2)将待插入节点着色为“红色”;
插入节点颜色是认为规定,但为什么是红色而不是黑色?主要是根据红黑树特性5,如果插入节点时红色可以减少节点对改特性的影响。
(3)根据实际情况调整平衡树,使其重新变成红黑树
插入新节点后,有可能不满足红黑树特性。对于特性1,明显不会改变;节点2不受影响,因为节点插入也不会改变根节点;节点3不受影响,因为叶子节点一直为NIL,黑色;特性4有可能会受影响,因为新插入节点后特性可能不再满足;特性5不受影响,因为我们插入时节点颜色为红色。
数据删除步骤:
(1)按平衡二叉树的方式删除数据;
- 情况1:被删除节点没有儿子,即为叶节点。直接将该节点删除就OK了
- 情况2:被删除节点只有一个儿子。直接删除该节点,并用该节点的唯一子节点顶替它的位置。
-
情况3: 被删除节点有两个儿子。先找出它的后继节点;然后把“它的后继节点的内容”复制给“该节点的内容”;之后,删除“它的后继节点”。在这里,后继节点相当于替身,在将后继节点的内容复制给"被删除节点"之后,再将后继节点删除。这样就巧妙的将问题转换为"删除后继节点"的情况了,下面就考虑后继节点。 在"被删除节点"有两个非空子节点的情况下,它的后继节点不可能是双子非空。既然"的后继节点"不可能双子都非空,就意味着"该节点的后继节点"要么没有儿子,要么只有一个儿子。若没有儿子,则按"情况1 "进行处理;若只有一个儿子,则按"情况2 "进行处理。
3. 总结
碰上中秋国庆双假,早该完成的文章拖到现在才完成,为自己的拖延症表示愧疚。当然,红黑树并不是三言两语就能说清楚,草草画了以思维导图,方便自己记忆,由于水平有限,有不妥之处请各位指正,后续会继续完善。