1. 程式人生 > >算法學習筆記:紅黑樹

算法學習筆記:紅黑樹

當前 com 情況 路徑 沒有 四種 刪除 http 調整

一、紅黑樹特性

1.節點只能為紅色或者黑色。

2.根節點為黑色。

3.葉節點(NIL)為黑色。

4.紅色節點的子節點必須時黑色節點。

5.任意節點到達該節點的子孫節點的路徑包含相同數目的黑色節點。

二、紅黑樹基本操作

技術分享圖片

三、插入節點

將紅黑樹作為一棵普通的搜索樹進行插入,將插入節點塗為紅色。之後有三種情況:

1.若當前節點為根節點,將插入節點塗為黑色。

2.若當前節點的父節點為黑色,不需要調整,仍然是紅黑樹。

3.若當前節點的父節點為紅色,將紅色節點移動到根節點後塗黑即可,依然有三種情況:

  Case 1:若當前節點的叔叔節點(父節點的兄弟節點)為紅色

    ①將父節點塗為黑色

    ②將叔叔節點塗為黑色

    ③將祖父節點塗為紅色

    ④將祖父節點設為當前節點繼續進行操作

技術分享圖片

  Case 2:若當前節點的叔叔節點為黑色,且當前節點為其父節點的右子節點

    ①將父節點設為當前節點

    ②以當前節點為軸進行左旋

技術分享圖片

  Case 3:若當前節點的叔叔節點為黑色,且當前節點為其父節點的左子節點

    ①將父節點塗為黑色

    ②將祖父節點塗為紅色

    ③以祖父節點為軸進行右旋

技術分享圖片

四、刪除操作

將紅黑樹作為一棵普通的搜索樹進行刪除。

  1.若刪除節點沒有子節點,則直接將其刪除。

  2.若刪除節點只有一個子節點,則刪除該節點後其子節點代替其位置。

  3.若刪除節點有兩個子節點,交換刪除節點與其後繼節點。重復直到刪除節點滿足①或②,刪除之。

刪除結束後對紅黑樹進行調整

  1.若刪除節點為紅色,不需要調整,仍然是紅黑樹。

  2.若刪除節點為黑色,那麽我們假設代替刪除節點初始位置的節點繼承了刪除節點的黑色,將這個多余的黑色向樹根移動即可。存在三種情況:

    (1)若多余的黑色所在的節點為紅色,則將該節點塗為黑色即可恢復紅黑樹性質。

    (2)若多余的黑色所在的節點為黑色,且該節點為根,則不需要調整,仍然是紅黑樹。

    (3)若多余的黑色所在的節點為黑色,但該節點不為根,則存在四種情況

      Case 1:當前節點的兄弟節點為紅色

        ①將當前節點的兄弟節點塗為黑色

        ②將當前節點的父節點塗為紅色

        ③以當前節點的父節點為軸進行左旋

      Case 2:當前節點的兄弟節點為黑色,且兄弟節點的子節點均為黑色

        ①將當前節點的兄弟節點設為紅色

        ②將當前節點多余的黑色移動到其父節點

      Case 3:當前節點的兄弟節點為黑色,且兄弟節點的左子節點為紅色,右子節點為黑色

        ①將當前節點的兄弟節點的左子節點塗為黑色

        ②將當前節點的兄弟節點塗為紅色

        ③以當前節點的兄弟節點為軸進行右旋

      Case 4:當前節點的兄弟節點為黑色,且兄弟節點的右子節點為紅色,左子節點為紅色或黑色

        ①將當前節點的兄弟節點塗為其父節點的顏色

        ②將當前節點的父節點塗為黑色

        ③將當前節點的兄弟節點的右子節點塗為黑色

        ④以當前節點的父節點為軸進行左旋

        ⑤將當前節點設置為根節點

算法學習筆記:紅黑樹