【问题标题】:Inserting into red black tree when the parent P is red but the uncle U is black父P为红色而叔U为黑色时插入红黑树
【发布时间】:2019-05-16 11:00:29
【问题描述】:

这是wiki 在红黑树中插入节点时的情况 4。

正如picture 所示,节点“U”似乎不是 NIL,因为它有 chlidren。

但它是一棵红黑树吗?

图片是错的还是我错过了什么?

【问题讨论】:

    标签: data-structures red-black-tree


    【解决方案1】:

    但它是一棵红黑树吗?

    没有。这是插入节点后的红黑树,在本例中为 N。这是修复树的所有过程的一部分,因此它再次成为红黑树。

    图片没有错。

    当插入发生时,新节点将位于底部,一个叶子节点,它通常是红色的。修复过程针对根目录工作(并且保证工作)。

    用伪算法术语来说,算法是

    LOOP
       P = PARENT(N)
       IF P == NULL THEN
          'N MUST BE ROOT
          N.COLOUR = BLACK
          RETURN
       ENDIF
       IF P.COLOUR == BLACK THEN
          'FIXUPS HAVE ENDED
          RETURN
       ENDIF
       'NOTE: SINCE PARENT IS RED AND PREVIOUSLY WAS A RED-BLACK TREE THEN
       'GRANDPARENT EXISTS AND MUST BE BLACK AS ROOT NODE IS BLACK
       G = GRANDPARENT(N)
       U = UNCLE(N)
       IF U.COLOUR = RED THEN
           'COLOUR FLIP. BLACK NODE HEIGHT DOES NOT CHANGE
           P.COLOUR = BLACK
           U.COLOUR = BLACK
           G.COLOUR = RED
           'BUT G's PARENT COULD BE RED, SO LOOP AGAIN WITH NEW N BEING G
           N = G
        ELSE
           'PARENT IS RED AND UNCLE IS BLACK
           IF N IS ON INSIDE UNDERNEATH G
               ROTATE OUTWARDS ABOUT P
               N = P
           END IF
           'N IS ON OUTSIDE
           ROTATE ABOUT G TOWARD U
           P.COLOUR = BLACK 'NEW GRANDFATHER
           G.COLOUR = RED   'NEW UNCLE
           'N.COLOUR = RED  'NO CHANGE
           RETURN
        END IF
    
    
    ENDLOOP
    

    【讨论】:

    • 但即使没有“N”节点,这棵树也不应该是有效的红黑树,不是吗?
    • 小东:不,你是对的。但该图是一棵正在修整中的红黑树。当您执行插入或删除时,您可能会暂时违反红黑树属性。对于插入,您可能会违反这样一个事实,即您的父母和孩子都是红色的。对于删除,您可能违反了每个路径中的黑树计数不相同的事实。对根的修复将修复树。这总是可以做到的。 OP的照片就是其中的一个舞台。它还不是一棵红黑树,但一旦修复完成就会是。
    猜你喜欢
    • 2013-03-05
    • 2018-11-06
    • 2013-11-17
    • 2013-02-09
    • 2019-06-04
    • 2020-11-29
    • 2014-01-13
    • 2018-05-30
    相关资源
    最近更新 更多