紅黑樹本質上是一棵近似平衡的二叉樹,它的節點只有兩種顏色即紅與黑,它滿足二叉搜尋樹的基本性質,即樹上的任何節點的值大於其左子節點(若左子節點存在),任何節點的值大於其右子節點的值(若右子節點存在)。
近似平衡:深度最大的節點的深度<= 2 * 深度最小的節點的深度。具體如何保證這種近似平衡後面會說到。
紅黑樹與平衡二叉樹比較:
因為紅黑樹只追求近似平衡,所以在插入與刪除節點時,翻轉次數遠遠少於平衡樹,因此在需要較多插入刪除操作的場景中,使用紅黑樹更好。
同樣也因為近似平衡,所以在查詢時,紅黑樹查詢的深度可能會大於平衡二叉樹,所以在需要較多查詢的場景中,使用平衡二叉樹更好。
(來自網路)
性質1 . 節點是紅色或黑色。
性質2 . 根節點是黑色。
性質3 . 每個葉節點(nil節點,空節點)是黑色的。
性質4 . 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
性質5 . 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
因為性質5,所以延伸除了近似平衡狀態,試想根節點到每個葉子節點的黑色節點個數相同,而每兩個紅色節點之間不能直接相連,根節點又必須為黑色,所以推導出:黑色節點個數<=每條路徑的總節點個數<=2倍的黑色節點數,所以最大深度與最小深度的最多相差一倍。
因為性質5,預設新插入的節點都為紅色,就算有顏色衝突,也可以通過變色和旋轉來修改樹。
注意:紅黑樹的查詢、刪除、新增操作都為log(n)。
1、查詢操作,是乙個遞迴過程,很簡單,與當前節點比較,若大於該節點則查詢右子樹,若小於該節點則查詢該節點的左子樹。log(n)複雜度。
2、新增操作,首先通過查詢操作找到合適的插入位置,不能破壞平衡性質(左子節點《父節點《右子節點)。
插入後,進行變色、旋轉操作保證這個樹的五個性質。
3、刪除操作,先查找到該節點的位置,將該節點置為空,之後通過變色、旋轉等操作保證樹的這五個性質。
具體變色、旋轉的流程,我會在之後補上。
樹 紅黑樹(通俗易懂)
由於紅黑樹本質上就是一棵二叉查詢樹,所以在了解紅黑樹之前,咱們先來看下二叉查詢樹。二叉查詢樹 binary search tree 也稱有序二叉樹 ordered binary tree 排序二叉樹 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 因為,一棵由n個結點,隨...
通俗易懂的C STL
泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。泛型程式設計在c 上的應用主要體現在兩方面 函式模板和類模板。接下來舉個栗子 csdn部落格 anyway,模板...
紅黑樹的部分易懂內容
嚴重參考 紅黑樹的定義 及性質 是一種二叉搜尋樹,有序的 做的改進是 對節點新增了 顏色分層 red 或者 black 的特性,紅黑平衡,保持了紅黑樹lgn高度。為了保證二叉樹的高度,保證搜尋 刪除 插入的 時間複雜度為 lgn.性質 每個節點顏色 非黑即紅 根節點為黑色 每個葉子節點都是黑色 這裡...