1. 程式人生 > >再論紅黑樹

再論紅黑樹

使用 繼續 bsp 我們 時間復雜度 必須 葉子 case 新節點

紅黑樹:

紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹 :

l 每個節點或者是黑色,或者是紅色。

l 根節點是黑色。

l 每個葉子節點是黑色。

l 如果一個節點是紅色的,則它的子節點必須是黑色的。

l 從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。

紅黑樹的各種操作的時間復雜度是O(log2N)。

紅黑樹 vs AVL

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

插入操作

技術分享圖片

紅父
如果新節點的父結點為紅色,這時就需要進行一系列操作以保證整棵樹紅黑性質。如下圖所示,由於父結點為紅色,此時可以判定,祖父結點必定為黑色。這時需要根據叔父結點的顏色來決定做什麽樣的操作。青色結點表示顏色未知。由於有可能需要根結點到新點的路徑上進行多次旋轉操作,而每次進行不平衡判斷的起始點(我們可將其視為新點)都不一樣。所以我們在此使用一個藍色箭頭指向這個起始點,並稱之為判定點。

技術分享圖片

l 紅叔
當叔父結點為紅色時,如下圖所示,無需進行旋轉操作,只要將父和叔結點變為黑色,將祖父結點變為紅色即可。但由於祖父結點的父結點有可能為紅色,從而違反紅黑樹性質。此時必須將祖父結點作為新的判定點繼續向上(叠代)進行平衡操作。

技術分享圖片

需要註意的是,無論“父節點”在“叔節點”的左邊還是右邊,無論“新節點”是“父節點”的左孩子還是右孩子,它們的操作都是完全一樣的(其實這種情況包括4種,只需調整顏色,不需要旋轉樹形)。

l 黑叔
當叔父結點為黑色時,需要進行旋轉,以下圖示了所有的旋轉可能:
Case 1:

技術分享圖片

Case 2:

技術分享圖片

Case 3:

技術分享圖片

Case 4:

技術分享圖片

再論紅黑樹