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樹。