1. 程式人生 > >2-3-4樹、紅黑樹、B樹

2-3-4樹、紅黑樹、B樹

2-3-4樹

        

         如上圖所示。

         有的節點存一個值,則有2個孩子,如:

                   W(比W小的為左海子,比W大的為右孩子)

         有的結點存兩個值,則有3個孩子,如:

                   MO(比M小的為左海子,M到O之間的為中間孩子,比O大的為右孩子)

         有的結點存三個值,則有4個孩子:FGJ

         最後,所有的葉子節點都在同一層,或者說高度都一樣。

         這樣的樹就是“2-3-4樹”。

查詢

         2-3-4樹的查詢和二叉樹差不多,只不過對於一個節點存多個值的,需要判斷下是往左孩子走還是中間孩子還是右孩子。

插入

         這個需要分分情況。

         情況1:

         如上圖所示,插入的B最後走到了存放A的節點,而該節點中只存放了一個數,所以直接將B放在該節點裡就好(當然需要對比下B是否比A大,大的放右邊,小的話放左邊)

         如果待插入的節點中有兩個值,同上。

         情況2:

         如上圖所示,我想插入H,但H走到了存放FGJ的節點,這個節點已經滿了(2-3-4樹中節點最多隻能存放3個值,這樣才能最多有4個孩子分支),這時就需要多做些操作了:

                   1,將FGJ的G提出來,於是就形成了這樣一個小樹(提取G是因為H比F大)

                           

                   2,將G放到父節點裡,H插入子結點,如下:

2-3-4樹變成二叉樹

         方法如下圖所示:

         

         第一幅圖:將M提出來,left繼續作為M的左海子,Mid和Right作為O的孩子

         第二福特:將M和Q提出來作為O的左右孩子,A和B作為M的左孩子,C和D作為Q的右孩子。

         這樣變換後,中序遍歷的結果保持不變。

2-3-4樹變成二叉樹後變成紅黑樹

         這時候如果再做一個操作:

                   把2-3-4樹變成的二叉樹中原來就存在的“老節點”塗成黑色,把“新節點”塗成紅色

                            如:剛才的操作中第一幅圖的節點M是新提取出來的,其他的節點還是“老節點”,所以節點M塗成黑色,其他的塗成紅色

                                     第二幅圖的節點O是“新節點”,所以節點O是黑色,其他的都是紅色

         這就是紅黑樹

什麼時候需要紅黑樹

         對於一個樹,不斷地有資料插入刪除,還要保持有一個比較好的時間複雜度,目前來說比較好的方案是紅黑樹,它可以保證期望時間複雜度是O(logN)。

         而幾乎任何一種程式語言都幫我們實現了紅黑樹,如map,它的後臺就是用紅黑樹實現的。

B樹

         2-3-4樹中一個節點最多隻能有4個孩子,那如果每個孩子數再多一些呢,這就是B樹。