数据结构-树系列之红黑树(五)

红黑树是树的数据结构中最为重要的一种。Java的容器TreeSet、TreeMap均使用红黑树实现。JDK1.8中HashMap中也加入了红黑树。C++ STL中的map和set同样使用红黑树实现。之前的文章已经详细介绍了2-3-4树的性质与操作。本篇文章将从2-3-4树与红黑树关系出发,详细阐明红黑树。
  2-3-4树和红黑树是完全等价的,但是2-3-4树的编程实现相对复杂,所以一般是通过实现红黑树来实现替代2-3-4树,而红黑树也同样保证在O(logN)的时间内完成查找、插入和删除操作。

定义

红黑树是每个节点都带有颜色属性的平衡二叉查找树 ,颜色为红色或黑色。除了二叉查找树一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

(1)节点是要么红色或要么是黑色
(2)根一定是黑色节点。
(3)每个叶子节点都带有两个空的黑色节点(称之为NIL节点,它又被称为哨兵)。
(4)每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。
(5)从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的色节点。

典型的红黑树:
在这里插入图片描述

性质

根节点到任意叶子节点的路径长度,最多相差一半。若树存在最短路径,则最短路径上均为黑色节点,那么第五条性质保证根节点到达最长路径与最短路径所包含的黑色节点数目相同,若最短路径长为N,则最长路径M=N+红色节点数目,性质4要求红色节点必定不连续,因此红色节点数目最多为N,则最长路径与最短路径最多相差N。

2-3-4树和红黑树的等价关系

如果一棵树满足红黑树,把红色节点收缩到其父节点,就变成了2-3-4树,所有红色节点都与其父节点构成3或4节点,其它节点为2节点。一颗红黑树对应唯一形态的2-3-4树,但是一颗2-3-4树可以对应多种形态的红黑树(主要是3节点可以对应两种不同的红黑树形态)。
在这里插入图片描述在这里插入图片描述

插入

插入节点的父节点为黑色

若待插入节点的父节点为黑色,则直接插入节点,并将插入的节点涂红,插入结束。父节点为黑色,插入红色节点并不会使红黑树违背5条性质。
此种情形对应的在2-3-4树中的插入操作为:待插入位置的节点为2-节点或者3-节点,直接插入节点。在这里插入图片描述插入节点的父节点为红色,叔叔节点为黑色

若待插入节点的父节点为红色,叔叔节点为黑色,此种情形又需要区分节点的插入位置,根据插入位置的不同进行相应的调整。此种情形共有四种:
  父节点P为G左孩子,插入位置为左孩子

若待插入节点C的父节点P是祖父节点G的左孩子,并且插入节点的位置位于父节点P的左孩子。调整过程如下:在这里插入图片描述右旋操作结束,将父节点P涂黑色,祖父节点G涂红色,调整完毕。在这里插入图片描述父节点P为G左孩子,插入位置为右孩子

若待插入节点C的父节点P是祖父节点G的左孩子,并且插入节点的位置位于父节点P的右孩子。调整过程如下:在这里插入图片描述左旋操作结束后,仍然违背性质4,此时的情形符合6.2.1。在以节点G为中心,执行右旋操作。右旋结束后,将节点C涂黑色,节点G涂红色,调整完毕。
在这里插入图片描述父节点P为G右孩子,插入位置为右孩子

若待插入节点C的父节点P是祖父节点G的右孩子,并且插入节点的位置位于父节点P的右孩子。此种情形是6.2.1情形的镜像。调整过程如下:在这里插入图片描述左旋操作结束,将父节点P涂黑色,祖父节点G涂红色,调整完毕。在这里插入图片描述父节点P为G右孩子,插入位置为左孩子

若待插入节点C的父节点P是祖父节点G的右孩子,并且插入节点的位置位于父节点P的左孩子。此种情形是6.2.2的镜像。调整过程如下:在这里插入图片描述右旋操作结束后,仍然违背性质4,此时的情形符合6.2.3。在以节点G为中心,执行左旋操作。左旋结束后,将节点C涂黑色,节点G涂红色,调整完毕。在这里插入图片描述插入节点的父节点为红色,叔叔节点为红色

若待插入节点C的父节点P为红色,且叔叔节点U为红色,则需要根据插入位置的不同,做出相应的调整。此种情形共有两种:插入位置为左子树在这里插入图片描述插入位置为右子树在这里插入图片描述

删除

删除红色叶子节点在这里插入图片描述删除红色节点,只有左子树或只有右子树在这里插入图片描述删除红色节点,既有左子树又有右子树

如果要删除的节点不是叶子节点,用要删除节点的后继节点替换(只进行数据替换即可,颜色不变,此时也不需要调整结构),然后删除后继节点,后继节点的删除同样要遵循红黑树的删除过程。

删除的黑色节点仅有左子树或者仅有右子树在这里插入图片描述在这里插入图片描述图中填充为绿色的节点代表既可以是红色也可以是黑色,下同。

其余的删除还有很多种情况,一一罗列感觉意义不大,待我再研究研究,争取用一张表格来归纳。(2019/6/4)

彩蛋

其实在《算法》第四版的书里,介绍的是更简易的红黑树,只允许左链接为红色节点,这样的红黑树与什么树等价呢?
Yeah,与2-3树是等价的。书中还有一个经典的图片,即是把红链接画平,就完全变成了2-3树。对于2-3-4树的红黑树,也可以把红链接画平,相信你会瞬间理解两者的等价关系。
在这里插入图片描述

本文部分参考:https://xiaozhuanlan.com/topic/5036471892 同学们可以移步去看一看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章