紅黑樹簡介

RB-INSERT-FIXUP(T, z)
while color[p[z]] = RED                                                  // 若「當前節點(z)的父節點是紅色」,則進行如下處理。
    do if p[z] = right[p[p[z]]]                                          // 若「z的父節點」是「z的祖父節點的右孩子」,則進行如下處理。
          then y ← left[p[p[z]]]                                         // 將y設置爲「z的叔叔節點(z的祖父節點的左孩子)」
               if color[y] = RED                                         // Case 1條件:叔叔是紅色
                  then color[p[z]] ← BLACK                    ▹ Case 1   //  (01) 將「父節點」設爲黑色。
                       color[y] ← BLACK                       ▹ Case 1   //  (02) 將「叔叔節點」設爲黑色。
                       color[p[p[z]]] ← RED                   ▹ Case 1   //  (03) 將「祖父節點」設爲「紅色」。
                       z ← p[p[z]]                            ▹ Case 1   //  (04) 將「祖父節點」設爲「當前節點」(紅色節點)
                  else if z = left[p[z]]                                // Case 2條件:叔叔是黑色,且當前節點是左孩子
                          then z ← p[z]                       ▹ Case 2   //  (01) 將「父節點」做爲「新的當前節點」。
                               RIGHT-ROTATE(T, z)             ▹ Case 2   // (02) 以「新的當前節點」爲支點進行右旋。
                          color[p[z]] ← BLACK                 ▹ Case 3   // Case 3條件:叔叔是黑色,且當前節點是右孩子。(01) 將「父節點」設爲「黑色」。
                          color[p[p[z]]] ← RED                ▹ Case 3   //  (02) 將「祖父節點」設爲「紅色」。
                          LEFT-ROTATE(T, p[p[z]])             ▹ Case 3   //  (03) 以「祖父節點」爲支點進行左旋。
       else (same as then clause with "right" and "left" exchanged)      // 若「z的父節點」是「z的祖父節點的右孩子」,將上面的操做中「right」和「left」交換位置,而後依次執行。
color[root[T]] ← BLACK
RB-INSERT-FIXUP(T, z)
while color[p[z]] = RED                                                  // 若「當前節點(z)的父節點是紅色」,則進行如下處理。
    do if p[z] = left[p[p[z]]]                                           // 若「z的父節點」是「z的祖父節點的左孩子」,則進行如下處理。
          then y ← right[p[p[z]]]                                        // 將y設置爲「z的叔叔節點(z的祖父節點的右孩子)」
               if color[y] = RED                                         // Case 1條件:叔叔是紅色
                  then color[p[z]] ← BLACK                    ▹ Case 1   //  (01) 將「父節點」設爲黑色。
                       color[y] ← BLACK                       ▹ Case 1   //  (02) 將「叔叔節點」設爲黑色。
                       color[p[p[z]]] ← RED                   ▹ Case 1   //  (03) 將「祖父節點」設爲「紅色」。
                       z ← p[p[z]]                            ▹ Case 1   //  (04) 將「祖父節點」設爲「當前節點」(紅色節點)
                  else if z = right[p[z]]                                // Case 2條件:叔叔是黑色,且當前節點是右孩子
                          then z ← p[z]                       ▹ Case 2   //  (01) 將「父節點」做爲「新的當前節點」。
                               LEFT-ROTATE(T, z)              ▹ Case 2   //  (02) 以「新的當前節點」爲支點進行左旋。
                          color[p[z]] ← BLACK                 ▹ Case 3   // Case 3條件:叔叔是黑色,且當前節點是左孩子。(01) 將「父節點」設爲「黑色」。
                          color[p[p[z]]] ← RED                ▹ Case 3   //  (02) 將「祖父節點」設爲「紅色」。
                          RIGHT-ROTATE(T, p[p[z]])            ▹ Case 3   //  (03) 以「祖父節點」爲支點進行右旋。
       else (same as then clause with "right" and "left" exchanged)      // 若「z的父節點」是「z的祖父節點的右孩子」,將上面的操做中「right」和「left」交換位置,而後依次執行。
color[root[T]] ← BLACK

 

RB-DELETE-FIXUP(T, x)
while x ≠ T.root and x.color == BLACK  
      if x == x.p.left                                   // 若是x是它父親的左孩子
             w = x.p.right                                               // 若 「x」是「它父節點的左孩子」,則設置 「w」爲「x的兄弟」(即w爲x父節點的右孩子)                                          
               if w.color == RED                                           // Case 1: x是「黑+黑」節點,x的兄弟是紅色。(此時x的父節點和x的叔叔節點的子節點都是黑節點)。
                  then w.color = BLACK                         ▹  Case 1   //   (01) 將x的兄弟節點設爲「黑色」。
                       x.p.color = RED                         ▹  Case 1   //   (02) 將x的父節點設爲「紅色」。
                       LEFT-ROTATE(T, x.p)                     ▹  Case 1   //   (03) 對x的父節點進行左旋。
                       w = x.p.right                           ▹  Case 1   //   (04) 左旋後,從新設置x的兄弟節點。
               if w.left.color == BLACK and w.right.color == BLACK         // Case 2: x是「黑+黑」節點,x的兄弟節點是黑色,x的兄弟節點的兩個孩子都是黑色。
                  then w.color = RED                           ▹  Case 2   //   (01) 將x的兄弟節點設爲「紅色」。
                       x =  x.p                                ▹  Case 2   //   (02) 設置「x的父節點」爲「新的x節點」。
                  else if w.right.color == BLACK                          // Case 3: x是「黑+黑」節點,x的兄弟節點是黑色;x的兄弟節點的左孩子是紅色,右孩子是黑色的。
                          then w.left.color = BLACK            ▹  Case 3   //   (01) 將x兄弟節點的左孩子設爲「黑色」。
                               w.color = RED                   ▹  Case 3   //   (02) 將x兄弟節點設爲「紅色」。
                               RIGHT-ROTATE(T, w)              ▹  Case 3   //   (03) 對x的兄弟節點進行右旋。
                               w = x.p.right                   ▹  Case 3   //   (04) 右旋後,從新設置x的兄弟節點。
                        w.color = x.p.color                    ▹  Case 4   // Case 4: x是「黑+黑」節點,x的兄弟節點是黑色;x的兄弟節點的右孩子是紅色的。(01) 將x父節點顏色 賦值給 x的兄弟節點。
                        x.p.color = BLACK                      ▹  Case 4   //   (02) 將x父節點設爲「黑色」。
                        w.right.color = BLACK                  ▹  Case 4   //   (03) 將x兄弟節點的右子節設爲「黑色」。
                        LEFT-ROTATE(T, x.p)                    ▹  Case 4   //   (04) 對x的父節點進行左旋。
                        x = T.root                             ▹  Case 4   //   (05) 設置「x」爲「根節點」。
       else (same as then clause with "right" and "left" exchanged)        // 若 「x」是「它父節點的右孩子」,將上面的操做中「right」和「left」交換位置,而後依次執行。
x.color = BLACK
相關文章
相關標籤/搜索