红黑树 拼搏现实的明天。 2022-04-10 02:39 430阅读 0赞 # 红黑树 # ## 概念 ## 红黑树,又被称为对称二叉B树。 [红黑树模型][Link 1] 其本质是一种二叉查找树,单它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则。这些规则使红黑树保证了一种平衡,插入、删除。查找的最坏时间复杂度都为`O(log n)`,它的统计性能好于平衡二叉树(AVL树) ### 特性 ### 1. 每个节点要么是红色,要么是黑色 2. 根节点永远是黑色的 3. 所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 NIL 节点) 4. 每个红色节点的两个子节点一定都是黑色 5. 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点 ### 黑色高度 ### 从根节点到叶子节点的路径上,黑色节点的个数 ## 红黑树的左旋右旋 ## 红黑树的左旋右旋目的是调整红黑节点结构,转移黑色节点位置,使其在进行插入、删除后任能保持红黑树的5条性质 ### 左旋 ### 把右孩子变成自己的父节点,自己变成右孩子的左孩子,右孩子的左孩子变成自己的右孩子 ![左旋][20181224105337598] ### 右旋 ### 即左旋反过来实现 ## 红黑树的平衡插入 ## 红黑树的节点插入主要分两步 * 首先和二叉查找树的插入一样 * 然后调整结构,保证满足红黑树状态 * 对节点进行重新填色 * 对树结构进行旋转 ### 插入节点 ### 就如二叉查找树一样先插入节点 ### 插入后调整红黑树结构 ### 插入的节点颜色可能有两种 * 插入的节点为黑色,那么一定会违背第五条特性 * 插入的节点是红色,当我们是在红色节点下插入红色节点,那么一定会违背第四条特性 综合上面的情况考虑,插入黑色是一定会违背特性的,那么插入的节点一定要是红色,此时只要关心父节点是否为红,如果是红的,就要把父节点进行变化,让父节点变成黑色,或者换一个黑色节点当父亲,这些操作的同时不能影响不同路径上的黑色节点数一致的规则 #### 情况一:父节点和叔叔节点都是红色 #### ![父节点和叔叔节点都是红色][20181224105337619] 最简单的方式是将父节点`P`染黑,此时会违背特性四和特性五,那不如将父节点`P`和叔叔节点`U`一起变成黑色,然后将爷爷节点`G`染红即可,因为两个孩子节点是黑色节点的父节点是红色节点,并且要满足特性五 但是如果爷爷节点`G`的父节点也是红色的呢?那就得递归了 #### 情况二:父节点为红色,叔叔节点是黑色 #### ![仅父节点是红色][20181224105337635] 同样先考虑父节点`P`变成黑色,此时违背特性五,也没有别的办法,只有考虑变化爷爷节点`G`,但是如果单纯改父节点`G`的颜色会不满足特性五,所以考虑将父节点`P`右旋,这时把父节点`P`变成黑的,多了一个黑节点,再把爷爷节点`G`变成红的,就平衡了 上述情况都是插入的节点为左孩子 #### 当插入节点是右孩子时 #### ![加入节点是右节点][20181224105337652] ## 红黑树的平衡删除 ## 红黑树的节点删除也分为两步 * 二叉查找树的删除 * 结构调整 ### 二叉查找树的删除 ### #### 情况一:要删除的节点正好是叶子节点 #### 直接删除 #### 情况二:有左孩子或者右孩子,仅拥有一个 #### 直接把这个孩子上移放到要删除的位置 #### 情况三:有两个孩子 #### 就需要选一个合适的孩子节点作为新的根节点,该节点称为**继承节点** ### 删除后的结构调整 ### 删除的节点颜色有两种可能 * 如果当前待删除节点是红色的,它被删除之后对当前树的特性不会造成任何破坏影响 * 如果被删除的节点是黑色的,这就需要进行进一步的调整来保证后续的树结构满足要求 所以只需要考虑删除节点是黑色的情况 #### 情况三: #### 可以先将继承节点替换该节点,然后使用情况一或者情况二的后续解决办法即可 #### 情况二: #### 满足情况二的节点一定是红色节点,可以直接删除,最简单 #### 情况一: #### 此等情况相对复杂 ##### 情况一:待删除节点D的兄弟节点S为红色(以D为右节点为例) ##### 将父节点和兄弟节点的颜色互换,然后将父节点左旋 ![兄弟节点是红色][20181224105337669] ##### 情况二:兄弟节点是黑色,远侄子节点是红色(绿色可为任何颜色) ##### 将父节点和兄弟节点的颜色对调,然后将父节点左旋,若近侄子节点为黑,必为`NIL`节点 ![兄弟节点为黑,远侄子节点为红][20181224105337687] ##### 情况三:兄弟节点是黑色,近侄子节点是红色(绿色可为任何颜色) ##### 将兄弟节点右旋,然后将父节点左旋,再将近侄子节点和父节点交换颜色,并把父节点置为黑 ![兄弟节点为黑,近侄子节点为红][20181224105337706] ##### 情况四:兄弟节点是黑色,且为叶子节点 ##### 直接将兄弟节点设置为红色 ![兄弟节点为黑,近侄子节点为红][20181224105337725] [Link 1]: https://sandbox.runjs.cn/show/2nngvn8w [20181224105337598]: /images/20220403/68cb961bb30e4fa4b4e6fc277007017f.png [20181224105337619]: /images/20220403/9a651a79692d450ebb2d98c0127a1765.png [20181224105337635]: /images/20220403/7de5909452d24bdda016a3545b5e2ef1.png [20181224105337652]: /images/20220403/c50045731f3b4a8a99dd1d193226c246.png [20181224105337669]: /images/20220403/bdc5f16cdfdc43c9a66241bcc7c45d28.png [20181224105337687]: /images/20220403/4e365a79289d4820b6a8e24a5e434f99.png [20181224105337706]: /images/20220403/e401f840d7514316a54f726c7c187ac5.png [20181224105337725]: /images/20220403/9339b7c7090d447b86158f6b233d18ed.png
相关 红黑树 红黑树(Red Black Tree) 是一种自平衡二叉查找树,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能,它虽然 谁践踏了优雅/ 2022年06月15日 12:57/ 0 赞/ 477 阅读
相关 红黑树 > 3.3 Balanced Search Trees > [http://algs4.cs.princeton.edu/33balanced/][http_algs4.c ╰+攻爆jí腚メ/ 2022年06月09日 12:48/ 0 赞/ 337 阅读
相关 红黑树 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在[计算机][Link 1]科学中用到的一种[数据结构][Link 2],典型的用途是实现[关联数组][Lin 刺骨的言语ヽ痛彻心扉/ 2022年04月23日 12:06/ 0 赞/ 282 阅读
相关 红黑树 转自 \[url\]http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html\[/url\] Dear 丶/ 2022年04月11日 05:50/ 0 赞/ 354 阅读
相关 红黑树 红黑树 概念 红黑树,又被称为对称二叉B树。 [红黑树模型][Link 1] 其本质是一种二叉查找树,单它在二叉查找树的基础上额外添加了一个标记(颜色),同时具 拼搏现实的明天。/ 2022年04月10日 02:39/ 0 赞/ 430 阅读
相关 红黑树 红黑树 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑 Myth丶恋晨/ 2022年02月24日 07:30/ 0 赞/ 409 阅读
相关 红黑树 先Mark,后续补充: [https://juejin.im/entry/58371f13a22b9d006882902d][https_juejin.im_entry_58 柔情只为你懂/ 2022年01月30日 14:57/ 0 赞/ 331 阅读
相关 红黑树 二叉查找树(BST) 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下 川长思鸟来/ 2021年10月24日 01:48/ 0 赞/ 387 阅读
相关 红黑树 介绍 红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍 墨蓝/ 2021年09月14日 23:34/ 0 赞/ 531 阅读
相关 红黑树 1. 从 2-3 树说起 一棵标准的 BST (二叉查找树 / 二叉搜索树)是长这个样子的: BST 其中,这棵二叉查找树中的每个结点也叫 2-结点 ,2-结点 就表示树... 系统管理员/ 2020年11月29日 04:30/ 0 赞/ 830 阅读
还没有评论,来说两句吧...