紅黑樹與平衡二叉樹

2022-06-16 21:18:11 字數 1058 閱讀 3438

性質1.節點是紅色或黑色。

性質2.根節點是黑色。

性質3.每個葉子節點都是黑色的空節點(nil節點)。

性質4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

性質5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

這些約束強制了紅黑樹的關鍵性質:從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長。結果是這個樹大致上是平衡的。因為操作比如插入、刪除和查詢某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同於普通的二叉查詢樹。

旋轉和顏色變化規則

1、新增的節點必須為紅色

2、變色的情況:當前結點的父親是紅色,且它的叔結點也是紅色

2.1 把父節點設定為黑色

2.2 把叔節點設定為黑色

2.3 把祖父節點設定為紅色

2.4 把當前指標定義到祖父節點,設為當前要操作的

3、左旋的情況:當前父節點是紅色,叔節點是黑色,且當前的節點是右子樹

3.1 以父節點作為左旋。

4、右旋的情況:當前父節點是紅色,叔節點是黑色,且當前的節點是左子樹

4.1 把父節點變成黑色

4.2 把祖父節點變為紅色

4.3 以祖父節點右旋轉

它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。這個方案很好的解決了二叉查詢樹退化成煉表的問題,把插入,查詢,刪除的時間複雜度最好情況和最壞情況都維持在o(logn)。但是頻繁旋轉會使插入和刪除犧牲掉o(logn)左右的時間,不過相對二叉查詢樹來說,時間上穩定了很多。

區別: 

1、紅黑樹放棄了追求完全平衡,追求大致平衡,在與平衡二叉樹的時間複雜度相差不大的情況下,保證每次插入最多隻需要三次旋轉就能達到平衡,實現起來也更為簡單。

2、平衡二叉樹追求絕對平衡,條件比較苛刻,實現起來比較麻煩,每次插入新節點之後需要旋轉的次數不能預知。

平衡二叉樹 紅黑樹

顏色調整,第一種情況uncle存在且為紅色,第二種和第三種情況,uncle不存在 uncle存在且為黑色,先處理第三種情況,針對parent進行左單旋。test.cpp include using namespace std enum colour template struct rbtreenod...

二叉查詢樹 平衡二叉樹 紅黑樹

先看幾個基本概念 樹 由根出發,指向n個孩子,孩子再指向孫子。這樣一種資料結構 二叉樹 每個接點最多有兩個孩子的樹 二叉查詢樹 每個結點的左子樹 結點 右子樹 平衡二叉樹 每個結點左右子樹的高度差不大於1 紅黑樹 從任一節點到其每個葉子的所有簡單路徑 都包含相同數目的黑色節點。當然還有其它性質 幾點...

二叉查詢樹 平衡二叉樹 紅黑樹

平衡二叉樹 首先是一棵二叉查詢樹。帶有平衡條件 每個結點的左右子樹的高度之差的絕對值 平衡因子 最多為1。紅黑樹 雖然本質上是一棵二叉查詢樹,但它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢 插入 刪除的時間複雜度最壞為o log n 還具體下列的特性 節點是...