1. 程式人生 > >查詢演算法(6)紅黑樹(RBT)

查詢演算法(6)紅黑樹(RBT)

前言:    

    2-3樹雖然能實現平衡性,但在插入和刪除的過程中需要判斷插入的節點是2-節點還是3-節點等一系列問題,實現複雜且會增加額外的開銷,所以就提出了紅黑樹(發明者--Sedgewick,1987年)

一.基本概念

 1. R-B Tree,全稱是Red-Black Tree,又稱為“紅黑樹”,它一種特殊的二叉查詢樹。紅黑樹的每個節點上都有儲存位表示節點的顏色,可以是紅(Red)或黑(Black)。

  2.紅黑樹的特性:

    (1)每個節點或者是黑色,或者是紅色

    (2)根節點是黑色

    (3)葉子節點是黑色

    (4)如果一個節點是紅色,則它的子節點必定為黑色,且父節點也必定為黑色

    (5)從一個節點到該節點的子孫節點所有路徑包含相同數目的黑色節點(確保沒有一條路徑會比其它路徑長出兩倍)

3.調整平衡的方式?

    (1)顏色變換

    (2)旋轉

二.RBT插入調整

    1.無需旋轉調整的情況

        (1)插入的節點為根節點,將插入節點紅染黑,簡稱rootOver

        (2)父節點為黑色,blackParentOver,簡稱bpOver

   2.需要旋轉調整的情況,僅僅需要考慮父節點為紅色的情況(下面的父節點預設為爺爺節點的左孩子,右孩子情況相反)

        (1)叔叔節點為紅色,插入節點可左可右;父叔節點染黑,爺節點染紅,插入節點回溯至爺節點

        (2)叔叔節點為黑色,插入節點為右孩子;左旋父節點,插入節點指向父節點,轉化為(3)

        (3)叔叔節點為黑色,插入節點為左孩子;父節點染黑,爺爺節點染紅,右旋爺節點

3.結論:RBT插入調整最多旋轉兩次

三.RBT刪除調整

    1.刪除紅色節點,不會影響BH,也不會影響到性質4.無需調整,直接刪除

    2.其它無需調整的情況為

        (1)當前節點為根節點,無論root什麼顏色,直接染黑(rootOver)

        (2)當前節點為紅色,將節點染黑,結束,redOver

    2. 刪除左孩子,分為四種情況:

        (1)兄弟節點為紅色,兄弟節點染黑,父節點染紅,左旋父節點

        (2)兄弟節點為黑色,左右侄子都為黑色,兄弟節點染紅,X回溯至父節點

        (3)兄弟節點為黑色,左侄紅,右侄黑,左侄染黑,右侄染紅,右旋兄弟

        (4)兄弟節點為黑色,左侄隨意,兄弟變父節點顏色,兄弟父節點都染黑,左旋父節點

四.插入和刪除演示

    1.插入

 依次插入[12,1,9,2,0,11,7,19,4,15,18,5]

(1)插入12,插入1


(2)插入9


(3)插入2


(4)插入0


(5)插入11


 (6)插入7


(7)插入19


(8)插入4



(9)插入15


(10)插入18



(11)插入5



2.刪除

佔坑...

三.性質分析

    性質1:一棵大小為N的紅黑樹高度不會超過2logN

                (最壞的情況是最左邊的節點全部是3-節點,而其餘為2-節點)

    性質2:一棵大小為N的紅黑樹中,根節點到任意節點的平均長度為~1.00logN

                (紅黑樹保證所有操作執行時間都是對數級別的)

四.紅黑樹相比AVL樹的優勢在哪?

    紅黑樹的查詢效能略微遜色於AVL樹,因為他比avl樹會稍微不平衡最多一層,也就是說紅黑樹的查詢效能只比相同內容的avl樹最多多一次比較,但是,紅黑樹在插入和刪除上完爆avl樹,avl樹每次插入刪除會進行大量的平衡度計算,而紅黑樹為了維持紅黑性質所做的紅黑變換和旋轉的開銷,相較於avl樹為了維持平衡的開銷要小得多