紅黑樹學習筆記

2021-05-31 21:40:49 字數 3009 閱讀 4249

二叉樹,他的定義是每個節點最多只有兩個子樹(即左子樹和右子樹,當然也可以沒有子樹),如下圖是乙個簡單的二叉樹:

對於這樣的資料結構,在c語言中通常這樣來定義結構體?

1

2

3

4

5

typedefstruct_binary_tree binarytree;

二叉搜尋樹,首先他也是乙個二叉樹,與二叉樹不同的是他加了乙個屬性值來進行排序,這個屬性要滿足兩個條件,1、每個節點的左子樹的值均小於該節點的值(在有左子樹的情況下);2、每個節點的右子樹的值均大於該節點的值(在有右子樹的情況下),如下圖是簡單的二叉搜尋樹:

對於二叉搜尋樹的資料結構,在c語言中一般這樣定義結構體:?

1

2

3

4

5

6

typdefstruct_binary_search_tree binarysearchtree;

平衡,上面講的兩個都是資料結構,而這個不是資料結構,是一種衡量效能的指標,為什麼這樣說呢?因為你越是讓這個樹平衡,那麼他的效率就越高,二分查詢法就是利用這一點來達到高效的目地,那麼如何讓一顆紅黑樹平衡呢?這裡先不講如何讓他平衡,我先告訴你平衡的定義,平衡即是左右子樹的深度之差的絕對值不大於1,對於上面的二叉搜尋樹,他不滿足平衡,因為左子樹的深度是2,右子樹的深度是4,他們之間的絕對值大於1,所以不平衡。

紅黑樹,終於到了本篇文章的主題,紅黑樹在涵蓋了二叉樹和二叉搜尋樹的內容之後,還加了乙個顏色屬性,這個顏色的目地就是為了讓這個二叉搜尋樹更平衡(看清楚這裡我用的是更平衡,並不是絕對平衡,因為紅黑樹是不能保證樹100%平衡,只能說是盡可能的平衡,在這裡千萬別鑽牛角尖),從而達到高效的目地。對於新增了這麼乙個顏色之後,紅黑樹又產生了新的條件,這產生的新條件就是紅黑樹的五大性質:1、節點顏色必須是紅或者黑;2、根節點必須是黑色;3、每個葉子節點是黑色;4、每個紅色節點的兩個子節點都是黑色;5、從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。在這裡有很多初學者就很迷惑,這個性質到底什麼意思?我要如何做才能保證紅黑樹的性質不被破壞?其實這裡你只需要記住這五大性質只是用來判斷一顆樹是否是紅黑樹,至於要怎麼做,這才是我們接下來要講的重點。當在一顆紅黑樹上進行新增和刪除操作後,有可能會破壞紅黑的五大性質,那破壞了性質我們又該如何處理呢?對於每一種可能發生的情況,設計紅黑樹的作者都給出了相應的解決方案,對於開發人員而言,你只需要將每一種可能發生的情況對應的解決方案轉換為**即可。下面分別對新增和刪除後可能發生的情況給出了解決方案。

新增節點後產生的5個情況如下

情況1:當父節點與叔父節點都是紅色

解決方案:把祖父節點設為紅色,父節點與叔父節點設為黑色,然後從祖父節點開始向上繼續修復

情況2:當父節點是紅色,父節點是祖父節點的左孩子,並且當前節點是父節點的右孩子

解決方案:使用父節點為軸進行左旋轉,然後跳至情況3

情況3:父節點是紅色,父節點是祖父節點的左孩子,並且當前節點是父節點的左孩子

解決方案:父節點設為黑,祖父節點設定紅色,然後以祖父節點為軸進行右旋轉

情況4:當父節點是紅色,父節點是祖父節點的右孩子,並且當前節點是父節點的左孩子

解決方案:使用父節點為軸進行右旋轉,然後跳至情況5

情況5:當父節點是紅色,父節點是祖父節點的右孩子,並且當前節點是父節點的右孩子

解決方案:父節點設成黑色,祖父節點設為紅色,以祖父節點為軸進行轉旋轉

刪除節點後產生的情況如下:

在刪除乙個節點後,如果該節點的左、右子樹都存在,那麼用他右子樹中最小的節點來替代這個被刪除的節點,如果該節點只有左子樹,或者只有右子樹,那麼就用他的左節點或者右節點來代替這個節點,所以在以下描述中的當前節點是表示乙個被替換的新節點,並非被刪除的那個節點,切記,切記。

情況1:當前節點是父節點的左孩子,兄弟節點為紅色

解決方案:父節點染紅,兄弟節點為黑,然後以父母節點為軸進行左旋轉,然後重新獲取兄弟節點

情況2:當前節點是父節點的左孩子,兄弟節點的左、右孩子為黑色

解決方案:兄弟節點染紅,當前節點指向父節點,繼續修復

情況3:當前節點是父節點的左孩子,兄弟節點的右孩子是黑色

解決方案:把兄弟節點的左孩子染為黑色,兄弟節點染為紅色,以兄弟節點為軸進行右旋轉,重新獲取兄弟節點,然後跳轉到情況4

情況4:當前節點是父節點的左孩子,兄弟節點的左、右孩子其中乙個為紅

解決方案:兄弟節點顏色為父節點顏色,父節點為黑色,兄弟節點右孩子為黑色,然後以父節點為軸進行左旋轉

情況5:當前節點是父節點的右孩子,兄弟節點為紅色

解決方案:兄弟節點染黑,父節點染紅,以父節點為軸右旋轉

情況6:同情況2

情況7:當前節點是父節點的右孩子,兄弟節點的左孩子為黑色

解決方案:兄弟節點的右孩子染黑,兄弟節點染紅,以兄弟節點為軸進行左旋轉,重新獲取兄弟節點然後跳至情況8

情況8:當前節點是父節點的右孩子,兄弟節點的左、右孩子其中乙個為紅

解決方案:兄弟節點顏色染成父節點顏色,父節點為黑色,兄弟節點左孩子為黑色,以父節點為軸進行右旋轉

上面的13種情況是紅黑樹在新增和刪除節點時產生的,也配有相應的解決方案。細心的同學會發現,在上面的解決方案中多處用到了左旋轉和右旋轉,他們是如何實現的呢?其實這個在源**中也有寫,這裡我們這樣簡單的來理解,左旋轉即是將中心節點移到他右節點的左節點上,然後用他的右節點替換他的位置(如果中心節點的右節點的左節點已存在,那麼將中心節點的右節點的左節點移到中心節點的右節點上);右旋轉即是將中心節點移到他左節點的右節點上,然後用他的左節點替換他的位置(如果中心節點的左節點的右節點已存在,那麼將中心節點的左節點的右節點移到中心節點的左節點上)。對於上面兩個定義,有可能些同學會感覺有點繞口,但是如果根據這個定義你自己去畫張圖,你會理解的更好。

紅黑樹學習筆記

因為學習hashmap的時候,遇到了紅黑樹,故而複習哈,想深度學習的請轉到下面鏈結,作者 並茂的詳細講解了哈,分析的很清楚,覺得好的不忘給別人手動比心。30張圖帶你徹底理解紅黑樹 因為從這裡開始,是自己的學習筆記,從上面提到的文章中學習總結的,主要是為了給自己看,記錄哈,容易忘記,純概念,可能比較苦...

紅黑樹學習筆記

1.每個節點不是紅色就是黑色 2.不可能有連在一起的紅色節點 3.根節點都是黑色的 root 沒有父節點的節點就是根節點,即入度為0 4.每個紅色節點的兩個子節點都是黑色,葉子節點都是黑色,出度為0,滿足了性質就可以近似的平衡了,不一定要紅黑,也可以是其他的。紅黑樹有三種旋轉方式 1.改變顏色 紅變...

紅黑樹筆記

1.紅黑樹的根是黑的 2.所有外部節點 nil 都是黑的 3.其餘節點若為紅則只能有黑孩子 紅節點的兒子和父親都是黑色的 4.外部節點到根途經的黑節點數目相等 黑深度 外部節點是一類本不存在的節點 引入是為了方便分析和實現 紅黑樹的區域性結構無非四種 總是假設插入的節點是紅色 除非是根 1.雙紅缺陷...