1. 程式人生 > >紅黑樹之一(基本性質,插入節點)

紅黑樹之一(基本性質,插入節點)

平衡二叉樹(AVL)是一種具有很好的效能的排序二叉樹,但是也並不完美。如果所需要維護資料變化也比較頻繁,這就需要經常對ALV樹進行調整,由於平衡二叉樹對其子樹的限制太嚴格,因而進行插入或者刪除時經常需要對樹進行調整,而且插入時需要調整的子樹可能就是樹本身,這就需要較長的時間來查詢需要調整的子樹的根節點;而對於刪除操作情況可能更糟,極端情況下,甚至需要遞迴的對每層進行調整一直調整到根節點。比如:


如果要在上圖中插入一個新的節點8,則它將成為節點7的右孩子,根據AVL樹的性質,以節點7、13、25、50為根節點的子樹的高度都變大,但是以節點7、13、25為根的子樹的平衡因子在插入後仍滿足AVL樹的要求,因而不需要調整,但是以節點50為根的樹的高度變大後,其平衡因子不再滿足ALV樹的要求,因而需要進行調整。也就說說在上圖所述的情形下,插入後需要一直回溯到原樹的根節點,並對其進行調整後,才能完成整個插入操作。


如果要從上圖中刪除節點7,則如果想要刪除後的仍為AVL樹,則需要調整兩次,第一次調整以節點25為根的子樹,第二次調整以節點50為根的“子”樹。(為了簡單起見,只是給出了需要調整兩次的示例,但已經足以展示需要遞迴的進行多次調整的情形。)

因而實際中更為常用的是另一種排序二叉樹--紅黑樹,它也是一種在二叉樹上添加了限制的樹,它實際上也對每個節點的子樹做了限制,實際上是另一種“平衡二叉樹"。

一、基本概念

紅黑樹是一種二叉排序樹(或者說查詢樹),但是它在每個節點上增加了一個域表示該節點的顏色,節點只有兩種顏色Red或Black,因此該樹被稱為紅黑樹。一棵滿足如下限制的二叉查詢樹就是一棵紅黑樹,或者說紅黑樹必須具備如下性質:

  1. 每個節點要麼是紅的,要麼是黑的。
  2. 根節點是黑的。
  3. 所有葉節點都是黑色(紅黑樹引入了NULL節點來作為其葉節點,需要注意的是一般在畫圖時都會忽略這些NULL節點)。
  4. 如果一個節點是紅的,那麼它的倆個兒子都是黑的。
  5. 對於任一節點而言,它到它的任意一個葉結點的每一條路徑都包含相同數目的黑結點。

這五個性質的最重要的結果就是確保了從紅黑樹的根節點到其任意一個葉子節點的路徑中,最長路徑的長度最多是最短路徑長度的二倍。其原因在於:

紅黑樹的第4條性質保證了這些路徑中的任意一條都不存在連續的紅節點,而紅黑樹的第5條性質又保證了所有的這些路徑上的黑色節點的數目相同。因而最短路徑必定是隻包含黑色節點的路徑,而最長路徑為紅黑節點互相交叉的路徑,由於所有的路徑的起點必須是黑色的,而紅色節點又不能連續存在,因而最長路徑的長度為全為黑色節點路徑長度的二倍。

紅黑樹的這一特性也意味著紅黑樹大體上是平衡的,其高度不會“太高”,因而可以獲得較好的插入、刪除、查詢效能。
紅黑樹的第3條性質的作用不那麼明顯,來看一棵樹:


如果沒有第三條性質的約束,這就是一棵紅黑樹,但是如果我們將第3條性質的約束畫出來就會發現它不是一棵紅黑樹,如下圖所示:


根據第三條性質的要求,從50到75的左葉子所經過的黑節點數目和從50到80的任意葉子所經過的黑節點數目應該一樣多,顯然不是,這就是第三條性質的價值。事實上觀察這棵樹可以發現,如果這棵樹是紅黑樹的話,紅黑樹的狀態就會很差,兩個交叉在根節點的連結串列就成了所謂的紅黑樹。

紅黑樹的插入、刪除、查詢操作的演算法複雜度也是O(logn),另外與AVL樹相比,紅黑樹有更好的統計效能,因此相對而言,它更常用。

二、紅黑樹的查詢

紅黑樹本質上還是一顆二叉樹,因而其查詢和AVL樹完全相同,沒什麼特別之處。

三、紅黑樹的插入

紅黑樹的插入需要注意的是,插入時,新節點的顏色都是紅色的,這是因為紅黑樹要求其任意一個節點到以該節點為根節點的子樹上的所有葉子節點的路徑上的黑節點數目相同,因而如果新增的新節點的預設顏色為黑色,則每次該性質都會被破壞。因而新增新節點時,新節點的顏色都為紅色。
插入可以分兩步來完成:第一步將新的紅色節點插入,第二步分析判斷屬於哪一種情形,並進行調整處理。調整需要分以下情形來分別處理:

3.1 新節點不存在父節點

這種情形處理很簡單,只要將新節點的顏色修改為黑色即可,該節點實際上就是紅黑樹的根節點。

3.2 新節點的父節點的顏色為黑色

如果父節點的顏色為黑色,則無需做任何調整。

3.3 新節點的父節點和叔父節點均為紅色


上圖往原來的紅黑樹中添加了新的節點N(ew),由於其父節點P(arent)和叔U(ncle)節點都是紅色的,因而需要進行調整,調整的方法是:
  1. 將其父節點P和叔父節點U的顏色變為黑色
  2. 新節點N顏色不變
  3. 其祖父節點G(randpa)(節點50)顏色改為紅色
這一步調整完後,可以得到

但是此時插入並沒有完成,由於新節點的祖父節點的顏色改變了,因而我們還需要判斷這個改變是否會違背紅黑樹的限制,如果會就需要根據具體的情形繼續進行調整,這個過程要一直遞迴的進行直到確保紅黑樹的限制都被滿足。(此時假設G就是根節點,則它滿足情形一,即不存在父節點的情形,直接將其顏色修改為黑色即可)。簡單的說就是如果某個節點的顏色在調整過程中被變成了紅色,就要將它看做新節點,來進行分析判斷並進行調整處理。
需要注意的是識別這種情形的依據是:新節點的父節點為紅色,並且新節點的叔父節點的顏色也為紅色,對新節點是其父節點的左子樹還是右子樹以及父節點和叔父節點的相對位置是沒有要求的。

3.4 新節點的父節點是紅色,叔父節點是黑色或不存在,新節點是其父節點的左孩子,父節點是祖父節點的左孩子


上圖往原來的額紅黑樹中添加了新節點N由於其父節點P(arent)和叔U(ncle)節點都是紅色的,因而需要進行調整,調整的方法是:
首選對以新節點的祖父節點G為根的子樹進行一次右旋,可以得到

然後再將節點P和G的顏色互換,得到

顯然N,P,G,U的顏色已經滿足紅黑樹的要求,再考察這個調整對路徑上黑節點數目的影響:
  • 調整前,節點N到根節點的路徑上需要經過黑節點G,調整之後需要經過黑節點P,黑節點數目不變。
  • 調整前,節點P到根節點的路徑上需要經過黑節點G,調整之後需要經過黑節點P,黑節點數目不變。
  • 調整前,節點G到根節點的路徑上需要經過黑節點G,調整之後需要經過黑節點P,黑節點數目不變。
  • 調整前,節點U到根節點的路徑上需要經過黑節點U,G,調整之後需要經過黑節點U,P,黑節點數目不變。
因而完成這兩步調整後,插入即可結束

3.5 新節點的父節點是紅色,叔父節點是黑色或不存在,並且新節點是其父節點的右孩子,父節點是祖父節點的左孩子


上圖往原來的額紅黑樹中添加了新節點N由於其父節點P(arent)和叔U(ncle)節點都是紅色的,因而需要進行調整,調整的方法是:
首選對以新節點的父節點P為根的子樹進行一次左旋,可以得到

調整後得到的情形和情形4相同,按照情形進行處理即可(即做一次右旋,然後交換顏色),也就說說在這種情形下需要先做一次左旋,再做一次右旋。
情形4和情形5討論的是父節點是祖父節點的左孩子的情形,父節點是祖父節點的右孩子的情形和分析的情形對稱。

相關推薦

之一基本性質插入節點

平衡二叉樹(AVL)是一種具有很好的效能的排序二叉樹,但是也並不完美。如果所需要維護資料變化也比較頻繁,這就需要經常對ALV樹進行調整,由於平衡二叉樹對其子樹的限制太嚴格,因而進行插入或者刪除時經常需要對樹進行調整,而且插入時需要調整的子樹可能就是樹本身,這就需要較長的時間

簡介Introduction to Red-black tree

紅黑樹簡介(Introduction to Red-black tree) 作者:Bluemapleman([email protected]) 麻煩不吝star和fork本博文對應的github上的技術部落格專案吧!謝謝你們的支援! 知識無價,寫作辛苦,歡迎轉載,

-RBT二、基本操作之左旋

都是 spa 左旋 class body 節點 圖片 如果 info 一、左旋   1、當在含有n個關鍵字的紅黑樹上運行時,TREE-INSERT和TREE-DELETE操作對樹作了修改,結果可能違反(一、紅黑樹--》2、定義)中給出的紅黑樹的性質,為了保持這些性質,就要改

演算法導論 第十三章: 筆記性質、旋轉、插入、刪除

紅黑樹(red-black tree) 是許多“平衡的”查詢樹中的一種,它能保證在最壞情況下,基本的動態集合操作的時間為O(lgn) 。 紅黑樹的性質: 紅黑樹是一種二叉查詢樹,但在每個結點上增加一個儲存位表示結點的顏色,可以是RED或BLACK 。通過對任何一條從根到葉子的路徑上各個結

【深入理解Java集合框架】講解

時間復雜度 row lee tel framework 關系 eight logs return 來源:史上最清晰的紅黑樹講解(上) - CarpenterLee 作者:CarpenterLee(轉載已獲得作者許可,如需轉載請與原作者聯系) 文中所有圖片點擊之後均可查看大

史上最清晰的講解

本文以Java TreeMap為例,從原始碼層面,結合詳細的圖解,剝繭抽絲地講解紅黑樹(Red-Black tree)的插入,刪除以及由此產生的調整過程。 總體介紹 Java TreeMap實現了SortedMap介面,也就是說會按照key的大小順序對Map中的元

史上最清晰的講解

上一篇文章史上最清晰的紅黑樹講解(上)對Java TreeMap的插入以及插入之後的調整過程給出了詳述。本文接著以Java TreeMap為例,從原始碼層面講解紅黑樹的刪除,以及刪除之後的調整過程。如果還沒有看過上一篇文章,請在閱讀本文之前大致瀏覽一下前文,以方便理解。 尋

資料結構和演算法 | 演算法

1 紅黑樹簡介 紅黑樹是一種自平衡的二叉查詢樹,是一種高效的查詢樹。它是由 Rudolf Bayer 於1978年發明,在當時被稱為對稱二叉 B 樹(symmetric binary B-trees)。後來,在1978年被 Leo J. Guibas 和 Rob

漫畫演算法:什麼是適合初學小白簡單易懂

———————————— 二叉查詢樹(BST)具備什麼特性呢? 1.左子樹上所有結點的值均小於或等於它的根結點的值。 2.右子樹上所有結點的值均大於或等於它的根結點的值。 3.左、右子樹也分別為二叉排序樹。 下

關於(R-B tree)原理看這篇如何

學過資料資料結構都知道二叉樹的概念,而又有多種比較常見的二叉樹型別,比如完全二叉樹、滿二叉樹、二叉搜尋樹、均衡二叉樹、完美二叉樹等;今天我們要說的紅黑樹就是就是一顆非嚴格均衡的二叉樹,均衡二叉樹又是在二叉搜尋樹的基礎上增加了自動維持平衡的性質,插入、搜尋、刪除的效率都比較高。紅黑樹也是實現TreeMap儲存結

動畫 | 什麼是與2-3-4等價

二分搜尋樹是為了快速查詢而生,它是一顆二叉樹,每一個節點只有一個元素(值或鍵值對),左子樹所有節點的值均小於父節點的值,右子樹所有的值均大於父節點的值,左右子樹也是一顆二分搜尋樹,而且沒有鍵值相等的節點。它的查詢、插入和刪除的時間複雜度都與樹高成比例,期望值是O(log n)。 但是插入陣列如[],二分搜尋樹

Java HashMap原始碼分析含散列表、、擾動函式等重點問題分析

# 寫在最前面 這個專案是從20年末就立好的 flag,經過幾年的學習,回過頭再去看很多知識點又有新的理解。所以趁著找實習的準備,結合以前的學習儲備,建立一個主要針對應屆生和初學者的 Java 開源知識專案,專注 Java 後端面試題 + 解析 + 重點知識詳解 + 精選文章的開源專案,希望它能伴隨你我一直

學習筆記 — (1) 定義、插入、刪除

紅黑樹(RBT)本質上是一種二叉查詢樹(BST),但它在二叉查詢樹的基礎上額外添加了一個標記(顏色),同時具有一定的規則。這些規則使紅黑樹保證了一種平衡,插入、刪除、查詢的最壞時間複雜度都為 O(logn)。 五個特性 每個節點是黑色或紅色 根節點(roo

【演算法】手撕—— 基本性質以及插入實現附帶程式碼實現

在閱讀其他博主關於紅黑樹增刪實現的時候,博主們大多直接使用文字圖片描述,對整個增刪整體的流程突出的不太明顯(當然dalao們寫得還是很棒得,不然我也寫不出這篇文章),所以我特意花了2天時間用CAD製作了 一張插入操作的流程圖和一張刪除操作的流程圖(刪除見下篇)並手撕程式碼(好吧,其實大部分時間在除錯程式碼,畢

關聯容器set的用法關聯容器

ise 特定 using iter tor pre .com main com set和multiset會根據特定的排序準則自動將元素排序,set中元素不允許重復,multiset可以重復。// 2017/7/23號 好像set容器裏面只能裝一個元素#include<

基本特點及其建立——轉

.cn targe html 必須 log post 一個 判斷 二叉查找樹 紅黑樹定義:   紅黑樹是一種自平衡二叉查找樹,紅黑樹和AVL都是BST(二叉排序樹)的平衡版本,相比於AVL的完全平衡,紅黑樹只要求局部平衡,因此當向紅黑樹插入和刪除結點時,需要調整的比AVL要

詳細分析看了都說好強烈推薦

1. 紅黑樹簡介 紅黑樹是一種自平衡的二叉查詢樹,是一種高效的查詢樹。它是由 Rudolf Bayer 於1972年發明,在當時被稱為對稱二叉 B 樹(symmetric binary B-trees)。後來,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改

二叉完全二叉滿二叉二叉排序平衡二叉B數B-B+B*

二叉樹 二叉樹:二叉樹是每個節點最多有兩個子樹的樹結構; 是n(n>=0)個結點的有限集合,它或者是空樹(n=0),或者是由一個根結點及兩顆互不相交的、分別稱為左子樹和右子樹的二叉樹所組成。 完全二叉樹 完全二叉樹:除最後一層外,每一層上的結點數均達到最

二叉完全二叉滿二叉二叉排序平衡二叉B數B-B+B*

二叉樹,完全二叉樹,滿二叉樹,二叉排序樹,平衡二叉樹,紅黑樹,B數,B-樹,B+樹,B*樹(一): BST樹 即二叉搜尋樹:        1.所有非葉子結點至多擁有兩個兒子(Left和Right);        2.所有結點儲存一個關鍵字;       

二叉之一BSTAVL詳解及B原理分析

BST樹,AVL樹詳解及B樹和紅黑樹原理分析 網際網路面試中樹尤其是BST,AVL是提問的重點也是難點,甚至B樹乃至高階資料結構紅黑樹都是提問的重點,像阿里雲面試就曾經問過map實現機制(紅黑樹)及其原理,這裡我們要做到對BST/AVL完全熟悉能給出全部程式碼實現,紅黑樹、