RBT

Posted nirvana · rebirth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RBT相关的知识,希望对你有一定的参考价值。

红黑树性值

  • 1、红黑树中每个节点要么是红的要么是黑的
  • 2、根节点必须是黑色的
  • 3、终端节点是黑色的
  • 4、不允许两个红节点互为父子关系
  • 5、从任意节点出发,到其所有可能到达的各个终端节点的各条路径上,黑色节点数目必须完全相同

  • 从一个节点出发,不会有一条路径长度超过另一条路径的2倍

  • 添加、删除、查找时间复杂度: O ( l o g 2 n ) O(log_2n) O(log2n)


添加

  • 1、【空树】:作为根(黑)

  • 2、【父黑】:直接放入(红)

  • 3、【父红】:

    • 3.1【叔红】:父→黑,叔→黑,爷→红,爷标记新 x x x 重新讨论
      (【若爷是根】:爷→黑,结束)

    PP刚好为根结点时,我们必须把PP重新设为黑色,那么树的红黑结构变为:黑黑红。换句话说,从根结点到叶子结点的路径中,黑色结点增加了。这也是唯一一种会增加红黑树黑色结点层数的插入情景
    我们还可以总结出另外一个经验:红黑树的生长是自底向上的。这点不同于普通的二叉查找树,普通的二叉查找树的生长是自顶向下的。

    • 3.2【叔黑】:
      • 3.2.1:【父是爷.左】:
        • 3.2.1.1:【x是父.右】:父标记为x,以x为支点左旋
        • 3.2.1.2:【x是父.左】:父->黑,爷->红,以爷为支点右旋
      • 3.2.2:【父是爷.右】:
        • 3.2.2.1:【x是父.左】:父标记为x,以x为支点右旋
        • 3.2.2.2:【x是父.右】:父->黑,爷->红,以爷为支点左旋

删除

(找左的最右|右的最左,之后都会转变=>删除某节点X,此节点至多有一个孩子)

1、【根、无孩子】:删除根空
2、【根、有一个红孩子】:删根、红子->黑,成为新根
3、【非根、红】:删除
4、【非根、黑、有一个红子】:删X,X子和X父连接,红子->黑
5、【非根、黑、无子】:删除X:5.1【兄弟是红】(父、侄一定是黑):父->红,兄->黑:5.1.1【兄是父的右】:以父为支点左旋
5.1.2【兄是父的左】:以父为支点右旋
5.2【兄弟是黑】:5.2.1【俩侄子全黑(由其他情况转移到此情况)|空】:5.2.1.1【父是红】:父->黑,兄->红。Over。
5.2.1.2【父是黑】:兄->红,父为新X;重新讨论,向上求助
5.2.2【左侄红、右侄黑】:5.2.2.1【兄是父.右】:兄->红,左侄->黑,以兄为支点右旋;=>5.2.3.2
5.2.2.2【兄是父.左】:兄->父.色,父->黑,左侄->红,以父为支点右旋。Over。
5.2.3【右侄红】 :5.2.3.1【兄是父.左】:兄->红,右侄->黑,以兄为支点右旋;=>5.2.2.2
5.2.3.2【兄是父.右】:兄->父.色,父->黑,右侄->黑,以父为支点左旋。Over。

以上是关于RBT的主要内容,如果未能解决你的问题,请参考以下文章

STM32G070RBT6基于Arduino串口的使用

什么是基于风险的测试(RBT)?

深入理解红黑树(RBT)

rbt setup-repo返回错误

STM32G070RBT6基于Arduino框架下点灯程序

BST(二叉搜索树),AVL(平衡二叉树)RBT(红黑树)的区别