小橙書閱讀指南(八)——紅黑平衡樹(1)

序言:紅黑樹是數據結構與算法中最重要的知識點之一,也是最難掌握的。網上有關它的討論不少,我曾經試圖閱讀那些「一篇文章讓你熟悉紅黑樹」之類,多是智力的緣故,效果平平。最終,我發現要想理解紅黑樹的特性和相關算法其實並沒有捷徑可走。因此,我打算經過多篇博客來解釋這個衆所周知卻又少有人精通的數據結構——RedBlackBalanceSearchTree。算法

1、標準二叉樹的非理想狀況數據結構

在理想狀態下,標準二叉樹的結構應該如此:spa

含有10個節點的二叉樹最大命中次數不超過3。可是標準二叉樹依賴是依賴輸入的,這也就意味着一樣的輸入造成的結構也多是這樣:3d

因此,問題就轉變成了如何讓二叉樹的結構不依賴輸入,或者說如何讓二叉樹保持自平衡。blog

2、2-3查找樹博客

爲了保證查找樹的平衡,咱們須要一些靈活性,所以在這裏咱們容許樹中的一個節點保存多個鍵。確切的說,咱們將一顆標準的二叉查找樹中的節點稱爲2-節點(包含一對自有鍵值和兩條子連接)。而如今咱們引入3-節點(包含兩對自有鍵值和3條子連接),同理咱們還定義了4-節點。io

3-節點的左子樹都小於自有鍵值中的任一鍵(咱們記做<),右子樹都大於任一鍵(咱們記做>),中間子樹則位於兩個自有鍵之間(咱們記做><):數據結構與算法

一顆完美的平衡2-3查找樹中的全部空鏈接(null link)到根節點的距離都應該是相同的。二叉樹

下面咱們將看到,如何在向一棵2-3樹中插入新鍵依然可以保持它的平衡(即:2-3樹的自平衡特性)。若是咱們須要在一個2-節點上掛新鍵只須要將這個2-節點變成一個3-節點便可:im

這裏演示了若是在2-節點(L)上掛新鍵(K)。可是若是須要在一個3-節點上掛新鍵就要麻煩一些,試着按照上圖想象一下掛(Z)的狀況。

因爲咱們要掛的地方已經沒有空間了,爲了將新鍵插入,咱們不妨先臨時將新鍵存入該節點(SX)中,使之成爲了一個4-節點(SXZ)。再把它轉換成爲一顆由3個2-連接組成的2-3樹,並把新生成的父節點(X)向上插入。

若是向上的過程當中遇到的依然是3-節點,咱們就以一樣的算法分解再向上直到它的根節點。若是到達根節點發現依然是3-節點的狀況咱們就會分解併產生新的根節點,同時2-3樹的高度+1。這是2-3樹的一條很重要的性質,它顯示了2-3樹是如何生長的:

2-3查找樹和二叉樹的區別之一就是,二叉樹是不斷向下生長,而2-3樹則是向上生長,這個特性保證了2-3樹中任一空節點到根節點的距離相等。所以咱們認爲2-3樹的結構不依賴輸入而且是自平衡的。

 

後記:本篇博客應該接在二叉樹後閱讀,不幸的是有關二叉樹的文章我尚未寫(咱就是這麼任性)。因此若是想讀懂本文請先了解二叉樹的相關知識或者等我在補齊了其餘知識點後再回頭來閱讀本文。

相關文章
相關標籤/搜索