1. 程式人生 > >通俗易懂的紅黑樹簡析

通俗易懂的紅黑樹簡析

一、基本概念

紅黑樹本質上是一棵近似平衡的二叉樹,它的節點只有兩種顏色即紅與黑,它滿足二叉搜尋樹的基本性質,即樹上的任何節點的值大於其左子節點(若左子節點存在),任何節點的值大於其右子節點的值(若右子節點存在)。 近似平衡:深度最大的節點的深度<= 2 * 深度最小的節點的深度。具體如何保證這種近似平衡後面會說到。 紅黑樹與平衡二叉樹比較:因為紅黑樹只追求近似平衡,所以在插入與刪除節點時,翻轉次數遠遠少於平衡樹,因此在需要較多插入刪除操作的場景中,使用紅黑樹更好。同樣也因為近似平衡,所以在查詢時,紅黑樹查詢的深度可能會大於平衡二叉樹,所以在需要較多查詢的場景中,使用平衡二叉樹更好。

(圖片來自網路)

二、紅黑樹的必須滿足的五條性質

性質1 . 節點是紅色或黑色。 性質2 . 根節點是黑色。 性質3 . 每個葉節點(NIL節點,空節點)是黑色的。 性質4 . 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點) 性質5 . 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。        因為性質5,所以延伸除了近似平衡狀態,試想根節點到每個葉子節點的黑色節點個數相同,而每兩個紅色節點之間不能直接相連,根節點又必須為黑色,所以推匯出:黑色節點個數<=每條路徑的總節點個數<=2倍的黑色節點數,所以最大深度與最小深度的最多相差一倍。
 因為性質5,預設新插入的節點都為紅色,就算有顏色衝突,也可以通過變色和旋轉來修改樹。  注意:紅黑樹的查詢、刪除、新增操作都為log(n)。

三、紅黑樹的操作

1、查詢操作,是一個遞迴過程,很簡單,與當前節點比較,若大於該節點則查詢右子樹,若小於該節點則查詢該節點的左子樹。log(n)複雜度。 2、新增操作,首先通過查詢操作找到合適的插入位置,不能破壞平衡性質(左子節點<父節點<右子節點)。插入後,進行變色、旋轉操作保證這個樹的五個性質。 3、刪除操作,先查詢到該節點的位置,將該節點置為空,之後通過變色、旋轉等操作保證樹的這五個性質。  具體變色、旋轉的流程,我會在之後補上。