什么是红黑树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
什么是红⿊树
在学习红⿊树之前,需要先理解⼆叉查找树(Binary Search Tree)。
⼀、⼆叉查找树
⼆叉查找树(BST)特性
1. 左⼦树上所有节点的值均⼩于或等于它的根节点的值。
2. 右⼦树上所有节点的值均⼤于或等于他的根节点的值。
3. 左、右⼦树也分别为⼆叉排序树。
(1)查找
查找⼀下节点值为10 的节点。
1. 根节点为9,10>9,查看右孩⼦13。
2. 10<13 ,查看左孩⼦11。
3. 10 < 11 ,查看左孩⼦ 10,刚好为需要查找的对象。
⼆叉查找树利⽤的正是⼆分查找的思想,查找所需的最⼤次数等同于⼆叉查找树的⾼度。
(2)插⼊
插⼊节点时,也使⽤类似的⽅法,通过⼀层⼀层的⽐较⼤⼩,找到新节点适合的位置,然后执⾏插⼊。
插⼊新节点的时候暴露出⼆叉查找树的缺陷。
假设现在我们需要依照BST的特性,向初始只有三个节点,根节点为9,左孩⼦为8,右孩⼦为12的BST中依次插⼊7,6,5,4,3。
其结果会⼊上图所⽰。
这样的形态虽然也符合⼆叉查找树的特性,但是查询的性能⼤打折扣,⼏乎变成线性的了。
红⿊树就较好的解决了⼆叉查找树多次插⼊新节点⽽导致的不平衡。
⼆、红⿊树
(1)红⿊树的特性
红⿊树(Red Black Tree)是⼀种⾃平衡的⼆叉查找树。
出了符合BST的基本特性外,还具有其他特性。
规则:
1. 节点是红⾊或⿊⾊的。
2. 根节点是⿊⾊的。
3. 每个叶⼦节点都是⿊⾊的空节点(NIL节点)。
4. 每个红⾊节点的两个⼦节点都是⿊⾊的。
(从每个叶⼦到根的所有路径上不能有两个连续的红⾊节点。
)
5. 从任⼀节点到其每个叶⼦的所有简单路径都包含相同数⽬的⿊⾊节点。
以上特性保证了红⿊树的⾃平衡。
红⿊树从根到叶⼦的最长路径不会超过最短路径的两倍。
当插⼊或删除节点时,红⿊树的规则有可能被打破。
例如:向原红⿊树插⼊值为21的新节点:
其⽗节点是红⾊的,违反了规则4(每个红⾊节点的两个⼦节点都是⿊⾊),我们需要进⾏必要的调整,使之重新符合红⿊树的规则。
(2)红⿊树的调整⽅式
红⿊树的调整⽅式有两种,分别是:变⾊,旋转。
其中旋转细分为:左旋转,右旋转。
变⾊:为了符合红⿊树的规则,尝试把红⾊节点转变为⿊⾊,或把⿊⾊变为红⾊。
(1)由于21,22都为红⾊节点,违反了规则4(每个叶⼦节点到根节点的所有路径上不能有连续的红⾊节点),所以将22变成⿊⾊。
(2)此时从25到其叶⼦节点违反了规则5,需要将25从⿊⾊变成红⾊。
(3)此时,25、27形成了两个连续的红⾊节点,需要将27变为⿊⾊。
左旋转:逆时针旋转红⿊树的两个节点,使得⽗节点被⾃⼰的右孩⼦取代,⽽⾃⼰成为左孩⼦。
右旋转:顺时针旋转红⿊树的两个节点,使得⽗节点被⾃⼰的左孩⼦取代,⽽⾃⼰成为右孩⼦。
在上述插⼊节点21的例⼦中,经过变⾊形成了17,25两个连续红⾊节点的结果。
如果将17变为⿊⾊,将打破规则4,由于根节点能是⿊⾊,所以根节点13不可能变成红⾊。
此时将13作为X,17作为Y进⾏左旋处理。
结果:
根据规则的2(根节点必须是⿊⾊)进⾏变⾊,17变为⿊⾊,根据规则5(从任⼀节点到其每个叶⼦的所有简单路径都包含相同数⽬的⿊⾊节点),13变为红⾊,8变为⿊⾊,1,11变为红⾊,6变为⿊⾊。
此时,红⿊树调整貌似已经调整到位,其实不然。
根据规则5可知从任⼀节点到其每个叶⼦的所有简单路径都包含相同数⽬的⿊⾊节点,从17到6到NIL节点的⿊⾊节点个数是4,⽽其他路径的⿊⾊个数是3,所以还需要继续处理。
我们将13看为X,8看为Y,进⾏右旋转操作。
结果:
然后进⾏变⾊,最终:
插⼊节点21到红⿊树中的操作就完成,其中的步骤⽐较复杂,具体步骤为:
变⾊ ——>左旋转——>变⾊ ——>右旋转——>变⾊。