做者:小傅哥
博客:https://bugstack.cnhtml
沉澱、分享、成長,讓本身和他人都能有所收穫!😄
紅黑樹,是一種高效的自平衡二叉查找樹
java
Rudolf Bayer 於1978年發明紅黑樹,在當時被稱爲對稱二叉 B 樹(symmetric binary B-trees)
。後來,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改成現在的紅黑樹
。面試
紅黑樹具備良好的效率,它可在近似O(logN)
時間複雜度下完成插入、刪除、查找等操做,所以紅黑樹在業界也被普遍應用,好比 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基於紅黑樹結構實現的。設計模式
死記硬背,很難學會
數據結構
紅黑樹的結構和設計都很是優秀,也一樣在實現上有着複雜的處理邏輯,包括插入或者刪除節點時;顏色變化、旋轉操做等操做。但若是隻把這些知識點硬背下來,何時染色、何時旋轉,是沒有多大意義的,用不了多久也就忘記了。因此這部分的學習,瞭解其根本更重要。函數
謝飛機,考你幾個紅黑樹的知識點🦀源碼分析
🤥飛機,2-3樹是不沒看,回去等消息吧!學習
在上一章節《講解2-3平衡樹「紅黑樹的前身」》,使用了大量圖例講解了2-3樹,並在標題處寫出它是紅黑樹的前身。閱讀後更容易理解紅黑樹相關知識。ui
紅黑樹規則編碼
1. 根節點是黑色 2. 節點是紅黑或者黑色 3. 全部子葉節點都是黑色(葉子是NIL節點,默認沒有畫出來) 4. 每一個紅色節點必須有兩個黑色子節點(也一樣說明一條鏈路上不能有鏈路的紅色節點) 5. 黑高,從任一節點到齊每一個葉子節點,通過的路徑都包含相同數目的黑色節點
那麼,這些規則是怎麼總結定義出來的呢?接下里咱們一步步分析講解。
首先2-3樹
(讀法:二三樹)就是一個節點有1個或者2個元素,而實際上2-3樹轉紅黑樹是由概念模型2-3-4樹
轉換而來的。-4叉
就是一個節點裏有3個元素,這在2-3樹中會被調整,可是在概念模型中是會被保留的。
雖然2-3-4樹
也是具有2-3樹
一樣的平衡樹的特性,可是若是直接把這樣的模型用代碼實現就會很麻煩,且效率不高,這裏的複雜點包括;
因此,但願找到一種平衡關係,既保持2-3樹平衡和O(logn)的特性,又能在代碼實現上更加方便,那麼就誕生了紅黑樹。
2-3樹
轉紅黑樹,也能夠說紅黑樹是2-3樹
和2-3-4樹
的另一種表現形式,也就是更利於編碼實現的形式。
簡單轉換示例;
從上圖能夠看出,2-3-4樹與紅黑樹的轉換關係,包括;
綜上,就是2-3-4樹的節點轉換,總結出來的規則,以下;
在簡單2-3樹轉換紅黑樹
的過程當中,瞭解到一個基本的轉換規則右旋定義,接下來咱們在一個稍微複雜一點的2-3樹
與紅黑樹的對應關係,以下圖;
上圖是一個稍微複雜點的2-3樹,轉換爲紅黑樹的過程,是不這樣一張圖讓你對紅黑樹更有感受了,同時它也知足一下條件;
經過在上一章節2-3樹的學習,在插入節點時並不會插到空位置,而是與現有節點融合以及調整,保持整個樹的平衡。
而紅黑樹是2-3-4樹的一種概念模型轉換而來,在插入節點時經過紅色連接相連,也就是插入紅色節點。插入完成後進行調整,以保持樹接近平衡。
那麼,爲了讓紅黑樹達到平衡狀態,主要包括染色、↔左右旋轉、這些作法其實都是從2-3樹演化過來的。接下來咱們就分別講解幾種規則的演化過程,以此更好了解紅黑樹的平衡操做。
左旋定義: 把一個向右傾斜的紅節點連接(2-3樹,3-叉雙元素節點),轉化爲左連接。
背景:順序插入元素,一、二、3,2-3樹保持平衡,紅黑樹暫時處於右傾斜。
接下來咱們分別對比兩種樹結構的平衡操做;
紅黑樹的左旋,只會處理與之對應的2-3樹節點進行操做,不會總體改變。
右旋定義: 把一個向左傾斜的紅節點鏈接(2-3樹,3-叉雙元素節點),轉換爲右鏈接。
背景:順序插入元素,三、一、1,2-3樹保持平衡,紅黑樹暫時處於左傾斜。
接下來咱們分別對比兩種樹結構的平衡操做;
你會發現,左旋與右旋是相互對應的,但在2-3樹中是保持不變的
左旋、右旋,咱們已經有了一個基本的概念,那麼接下來咱們再看一個能夠綜合左右旋以及對應2-3樹的演化案例,以下;
以上的例子分別演示了一個元素插入的三種狀況,以下;
在2-3樹中,插入一個節點,爲了保持樹平衡是不插入到空位置上的,當插入節點後元素數量有3個後則須要調整中間元素向上,來保持樹平衡。與之對應的紅黑樹則須要調整顏色,來保證紅黑樹的平衡規則,具體參考以下;
接下來咱們把上面講解到的旋轉
、染色
,運用到一個實際案例中,以下圖;
`
三、五、6
。七、四、2
,最小節點在中間,左旋平衡樹結構。七、四、2
爲作傾順序節點,所以須要作右旋操做。注意,全部鏈接紅色節點的,都是是紅色線。以此與2-3樹作對應。
根據2-3-4樹模型的紅黑樹,在刪除的時候基本是按照2-3方式進行刪除,只不過在這個過程當中須要染色和旋轉操做,以保持樹平衡。刪除過程主要能夠分爲如圖四種狀況,以下;
紅色子葉節點的刪除並不會破壞樹平衡,也不影響樹高,因此直接刪除便可,以下;
在編寫本篇文章時,參考了大量的資料進行校訂,包括優秀文章;