红黑树及其相关操作
AVL樹對二叉樹的要求較高,為了維護查找的性能,所做的計算和操作比較復雜,維護成本比較大。為了簡化維護的成本,同時又能保證查找的性能,提出了紅黑樹的概念。
紅黑樹(RBT)性質
- 每個結點都是有顏色的,紅色或黑色
- 根結點的顏色是黑色的
- 所有的空結點都是黑色的
- 每個紅色結點的孩子都是黑色的
- 紅黑樹上任意一點到所有空結點的所有路徑上的黑色結點樹是相同的
- 新插入的節點顏色是紅色的
紅黑樹相關術語說明及圖例
旋轉操作
右旋結點r操作步驟如下:
- 將結點r的指向結點s的左引用,改成指向結點s的右子樹
- 右旋結點r和結點s
- 將結點s的右子樹的引用改成指向結點r
如圖所示:
左旋結點r操作步驟如下:
- 將結點r指向結點s的右引用,改成指向結點s的左子樹
- 左旋結點r和結點s
- 將結點s左子樹的引用改成指向結點r
如圖所示:
插入操作
插入情況需要分情況討論:
插入情況一
空樹到新增一個節點,直接插入節點然后變色,如圖所示:
插入情況二
只有一個根節點的話,根結點是黑色的,那么直接插入新增結點,如圖所示:
插入情況三
插入結點N處父親結點P是紅色的,叔叔結點U是紅色的,結點N表示新插入的結點。需要再細分情況討論進行討論:此情況下紅黑樹的可能是一顆完整的紅黑樹,也可能是一顆紅黑樹的的一部分子樹;
- 若是一棵完成的紅黑樹,需要將父結點P和叔叔結點U變色,如圖所示:
-
若是一棵紅黑樹的子樹,需要分三步調整操作:
- 第一步,先將插入結點處N的父結點P和叔叔結點U變成黑色
- 第二步,再將祖父結點G結點變成紅色,這樣做的目的是保證經過結點G的路徑中黑色結點的數不變,因為當前我們看到的紅黑樹是一個大的紅黑樹的子樹,所以要考慮到性質5不被破壞
- 此時如果整棵紅黑樹滿足紅黑樹的性質,則停止紅黑樹的調整;如果不滿足紅黑樹的性質,就需要分情況討論如果出現的情況是當前的這種情況就需要重復第一步、第二步。如果不是,就需要看情況四和情況五進行處理。
????????????如圖所示:
上圖節點中的1,2,3,4,5代表結點之下的子樹或是NIL結點,上圖中顯示的是一個中間過渡狀態。后續都是以類似形式表示子樹
插入情況四
插入結點N處的父結點P為紅色,叔叔結點U為黑色,且新插入的結點N是結點P的右孩子,且結點P是結點G的右孩子,需要進行如下調整操作:
如圖所示:
插入情況五
插入結點N處的父結點P為紅色,叔叔結點U為黑色,且新插入的結點N是結點P的左孩子,且結點P是結點G的左孩子,需要進行如下調整操作:
如圖所示:
示例
情況三中的第二種情況以及情況四、情況五相對來說比較抽象,下面我舉個例子來幫助大家理解,情況三、情況四和情況五之間的關系,例子是從網上看到的紅黑樹相關例子,在此基礎上進行的調整,如圖所示:
如上圖所示對應情況三,結點4表示新插入的結點N,結點5為父結點P,結點8為叔叔結點U,需要按照情況三子樹情況進行調整:
在通過情況三的調整操作之后得到的紅黑樹的狀態正好符合情況四的描述,如圖所示:如上圖所示,結點7表示新插入的結點N,結點2為父結點P,結點14為叔叔結點U,結點11為祖輩結點G,按照情況四對應的操作進行調整,如圖所示:
經過情況四的調整操作以后得到的紅黑樹狀態正好符合情況五的描述,如圖所示:
如上圖所示,結點2表示新插入的結點N,結點7為父結點P,結點14為叔叔結點U,結點11為祖輩結點G,按照情況五的操作進行調整,如圖所示:
紅黑樹插入總結
通過示例我們可以看出,紅黑樹相關情況之間的關系,情況三的發生只是一個開始;根據情況三的調整,可能會產生情況四但不一定,也有可能是會差生情況三,也有可能是情況五,但是不論是什么情況,我們只要記住對應的狀況描述及相關的調整,就可以對紅黑樹進行調整了。
總結
- 上一篇: Service Mesh服务网格:是什么
- 下一篇: React解决长列表方案(react-v