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