红黑树

作者: 4c6ed2800025 | 来源:发表于2019-11-09 14:13 被阅读0次

1. 红黑树

1.1 红黑树的应用场景

红黑树需要具备的性质:

  1. 每一个节点或者为红色或者为黑色;
  2. 根节点是黑色的;
  3. 如果一个节点是红色的,那么其子节点必须是黑色的;
  4. 从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。

1.2 红黑树的旋转

1.2.1 左旋

rbtree_rotate_left.jpg

1.2.2 右旋

rbtree_rotate_right.jpg

2. 红黑树的插入

红黑树插入节点

Case1:叔叔节点为红色,

Case2:叔叔节点为黑色,当前节点为父节点的左子树;

Case3:叔叔节点为黑色,当前节点为父节点的右子树;

2.2 循环的停止条件

在2.1小节讨论了红黑树插入节点的三种可能情况,颜色修正、左旋或者右旋之后事情并没有结束,而是将某个节点作为新的当前节点继续迭代。那么什么时候递归可能结束呢?当初学习红黑树很少看到有对这个问题进行讨论,下面我们探讨一下。不难发现,Case-3经过一次调整之后变为父节点的左子树即Case-2的情形。故我们仅需要对于前两种情况进行讨论。

对于Case-1,经过一次调整,祖父节点着色为黑色且作为新的当前节点; image rbtree_insert_0.jpg

对于Case-2,经过重新着色和旋转,P节点取代了原来G节点的位置且为黑色。无论原来G节点的父节点为黑色还是红色,都不会违反红黑树的定义。因此无需继续调整。在上述操作中,我们并没有改变当前节点,当前节点仍为S节点。

rbtree_insert_1.jpg

3. 红黑树的删除

// TODO

  1. 待删除的节点没有子节点,直接删除
    2)待删除的节点只有一个子节点,则直接删除并将用子节点替代该节点
    3)待删除节点有两个子节点,则使用该节点的后继节点代替,并将后继节点作为新的待删除节点,此时待删除节点
    伪代码
RB-DELETE(T, z)
if left[z] = nil[T] or right[z] = nil[T]         
   then y ← z                                  // 若“z的左孩子” 或 “z的右孩子”为空,则将“z”赋值给 “y”;
   else y ← TREE-SUCCESSOR(z)                  // 否则,将“z的后继节点”赋值给 “y”。
if left[y] ≠ nil[T]
   then x ← left[y]                            // 若“y的左孩子” 不为空,则将“y的左孩子” 赋值给 “x”;
   else x ← right[y]                           // 否则,“y的右孩子” 赋值给 “x”。
p[x] ← p[y]                                    // 将“y的父节点” 设置为 “x的父节点”
if p[y] = nil[T]                               
   then root[T] ← x                            // 情况1:若“y的父节点” 为空,则设置“x” 为 “根节点”。
   else if y = left[p[y]]                    
           then left[p[y]] ← x                 // 情况2:若“y是它父节点的左孩子”,则设置“x” 为 “y的父节点的左孩子”
           else right[p[y]] ← x                // 情况3:若“y是它父节点的右孩子”,则设置“x” 为 “y的父节点的右孩子”
if y ≠ z                                    
   then key[z] ← key[y]                        // 若“y的值” 赋值给 “z”。注意:这里只拷贝z的值给y,而没有拷贝z的颜色!!!
        copy y's satellite data into z         
if color[y] = BLACK                            
   then RB-DELETE-FIXUP(T, x)                  // 若“y为黑节点”,则调用
return y
rbtree_delete_flow2.png

4. 参考

1. https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

rbtree_rotate_left.jpg
  1. https://en.wikipedia.org/wiki/Red%E2%80%93black_tree#Insertion

相关文章

  • 数据结构—树—红黑树

    红黑树概述 红黑树的插入 红黑树的删除

  • TreeMap

    需要先了解红黑树,这是之前分析红黑树的文章。之前在分析红黑树时,我认为红黑树=二叉查找树+红黑平衡,关于二叉查找树...

  • 数据结构与算法-AVL 红黑树

    AVL树AVL树 算法红黑树红黑树 B站

  • [转载]红黑树

    https://zhuanlan.zhihu.com/p/24367771红黑树简介红黑树插入红黑树删除

  • 拿下红黑树

    红黑树 红黑树、2-3树的简单定义: 实现红黑树的基本结构以及添加操作(维护定义,左旋、右旋、颜色反转) 红黑树与...

  • 红黑树

    啥是红黑树,红黑树 = 二叉树

  • 彻底理解红黑树(二)之 插入

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的插入情况...

  • 彻底理解红黑树(三)之 删除

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的删除情况...

  • Golang红黑树

    红黑树 红黑树是每个节点都带有颜色属性(红色或黑色)的二叉查找树。红黑树也属于自平衡二叉查找树。 红黑树具有如下性...

  • 数据结构红黑树添加、修改原理分析

    源码分析大纲 数据结构解析 红黑树试下原理刨析 数据结构解析 1.红黑树 1.1 红黑树概念 红黑树(Red Bl...

网友评论

      本文标题:红黑树

      本文链接:https://www.haomeiwen.com/subject/qtzvbctx.html