Algorithm 插入红黑树

Algorithm 插入红黑树,algorithm,insert,tree,red-black-tree,Algorithm,Insert,Tree,Red Black Tree,我正在学习算法课程,在我的课程幻灯片中,有一个插入红黑树的示例: 我的问题是,为什么我们不让“2”成为叶节点呢?看起来,如果我们让它成为一个叶节点,那么就不会违反红黑树的条件。我在这里遗漏了什么?一棵红黑树的所有叶子都必须是NIL 检查属性问题不在于图像第二棵树的位置,而在于不同节点的颜色。解释如下: 红黑树中的第一条规则是:新插入的节点必须始终为红色。在案例3中,节点2的父节点和父节点都是红色的。因此,它们需要重新着色为黑色,祖父会变红,但由于祖父是根,因此它会再次变黑 因此,新树(插入2后

我正在学习算法课程,在我的课程幻灯片中,有一个插入红黑树的示例:


我的问题是,为什么我们不让“2”成为叶节点呢?看起来,如果我们让它成为一个叶节点,那么就不会违反红黑树的条件。我在这里遗漏了什么?

一棵红黑树的所有叶子都必须是
NIL

检查属性

问题不在于图像第二棵树的位置,而在于不同节点的颜色。解释如下:

红黑树中的第一条规则是:新插入的节点必须始终为红色。在案例3中,节点2的父节点和父节点都是红色的。因此,它们需要重新着色为黑色,祖父会变红,但由于祖父是根,因此它会再次变黑

因此,新树(插入2后)应如下所示(r和b表示颜色,.b表示零节点):

您可能会问,为什么我们总是需要在RBT中插入红色节点?答案是,第一,我们知道RBT中的每个NIL节点都是黑色的,第二,我们有规则5
从给定节点到其任何后代叶子的每个简单路径都包含相同数量的黑色节点。
现在,如果我们在树的末尾插入黑色节点,则树将违反此规则,只需将2b放在树的上面,而不是2r,并保持红色1和7,然后从根到任何Nil节点计数黑色节点,您将看到一些路径有2个反向节点,一些路径有3个黑色节点。

基于相同的想法,解释如下:

在树数据结构的许多表示中,节点可能只有一个子节点,而叶节点包含数据。在这个范例中可以呈现红黑树,但它改变了一些属性,并使算法复杂化。因此,本文使用了“null leaves”

所以很明显,没有什么能阻止你按照自己的方式去做,但是你必须在你的算法中考虑到这一点,这使得它们变得更加复杂。也许通过使用OOP可以在某种程度上缓解这个问题,其中叶包含元素,但其行为就像具有空叶的节点


无论如何,这是一种折衷:在空间中(大约两个指针在C中设置为
NULL
),您可能会损失代码复杂性、计算时间或对象运行时表示(叶的专用方法)。

黑色高度不一致

如果计算从根搜索NIL节点的blacks节点数,则5-1-2-NIL有三个,而5-7-NIL或5-1-NIL只有两个


(规则:从给定节点到其任何后代NIL节点的每条路径都包含相同数量的黑色节点)

@noMAD:恐怕你的答案没有回答这个问题。@sowrov:我读了你的答案,你解释了插入,但你没有回答OP的问题。他问,
为什么我们不让“2”成为叶节点呢?
我刚刚回答了这个问题。
       5b
     /    \     
    1b     7b
  /   \    / \
 .b    2r .b  .b
       / \
      .b  .b