紅黑樹及其相關操做

AVL樹對二叉樹的要求較高,爲了維護查找的性能,所作的計算和操做比較複雜,維護成本比較大。爲了簡化維護的成本,同時又能保證查找的性能,提出了紅黑樹的概念。性能

紅黑樹(RBT)性質

  • 每一個結點都是有顏色的,紅色或黑色
  • 根結點的顏色是黑色的
  • 全部的空結點都是黑色的
  • 每一個紅色結點的孩子都是黑色的
  • 紅黑樹上任意一點到全部空結點的全部路徑上的黑色結點樹是相同的
  • 新插入的節點顏色是紅色的

紅黑樹相關術語說明及圖例

旋轉操做

紅黑樹旋轉操做

右旋結點r操做步驟以下:

  • 將結點r的指向結點s的左引用,改爲指向結點s的右子樹
  • 右旋結點r和結點s
  • 將結點s的右子樹的引用改爲指向結點r

如圖所示:紅黑樹右旋spa

左旋結點r操做步驟以下:

  • 將結點r指向結點s的右引用,改爲指向結點s的左子樹
  • 左旋結點r和結點s
  • 將結點s左子樹的引用改爲指向結點r

如圖所示:紅黑樹左旋it

插入操做

插入狀況須要分狀況討論:class

插入狀況一

空樹到新增一個節點,直接插入節點而後變色,如圖所示:紅黑樹插入狀況一基礎

插入狀況二

只有一個根節點的話,根結點是黑色的,那麼直接插入新增結點,如圖所示:
紅黑樹插入狀況二二叉樹

插入狀況三

插入結點N處父親結點P是紅色的,叔叔結點U是紅色的,結點N表示新插入的結點。須要再細分狀況討論進行討論:此狀況下紅黑樹的多是一顆完整的紅黑樹,也多是一顆紅黑樹的的一部分子樹;引用

  • 如果一棵完成的紅黑樹,須要將父結點P和叔叔結點U變色,如圖所示:

紅黑樹狀況三完整樹

  • 如果一棵紅黑樹的子樹,須要分三步調整操做:im

    1. 第一步,先將插入結點處N的父結點P和叔叔結點U變成黑色
    2. 第二步,再將祖父結點G結點變成紅色,這樣作的目的是保證通過結點G的路徑中黑色結點的數不變,由於當前咱們看到的紅黑樹是一個大的紅黑樹的子樹,因此要考慮到性質5不被破壞
    3. 此時若是整棵紅黑樹知足紅黑樹的性質,則中止紅黑樹的調整;若是不知足紅黑樹的性質,就須要分狀況討論若是出現的狀況是當前的這種狀況就須要重複第一步、第二步。若是不是,就須要看狀況四狀況五進行處理。

            如圖所示:狀況三子樹狀況
上圖節點中的1,2,3,4,5表明結點之下的子樹或是NIL結點,上圖中顯示的是一箇中間過渡狀態。後續都是以相似形式表示子樹d3

插入狀況四

插入結點N處的父結點P爲紅色,叔叔結點U爲黑色,且新插入的結點N是結點P的右孩子,且結點P是結點G的右孩子,須要進行以下調整操做:總結

  1. 第一步,左旋結點P
  2. 第二步,修改結點P、N的位置

如圖所示:

紅黑樹狀況四

插入狀況五

插入結點N處的父結點P爲紅色,叔叔結點U爲黑色,且新插入的結點N是結點P的左孩子,且結點P是結點G的左孩子,須要進行以下調整操做:

  1. 對結點G進行右旋
  2. 調整結點P和結點G的位置
  3. 互換結點P和結點G的顏色

如圖所示:紅黑樹狀況五

示例

狀況三中的第二種狀況以及狀況4、狀況五相對來講比較抽象,下面我舉個例子來幫助你們理解,狀況3、狀況四和狀況五之間的關係,例子是從網上看到的紅黑樹相關例子,在此基礎上進行的調整,如圖所示:狀況三示例
如上圖所示對應狀況三,結點4表示新插入的結點N,結點5爲父結點P,結點8爲叔叔結點U,須要按照狀況三子樹狀況進行調整:狀況三變動操做示例
在經過狀況三的調整操做以後獲得的紅黑樹的狀態正好符合狀況四的描述,如圖所示:狀況四描述如上圖所示,結點7表示新插入的結點N,結點2爲父結點P,結點14爲叔叔結點U,結點11爲祖輩結點G,按照狀況四對應的操做進行調整,如圖所示:狀況四變換操做
通過狀況四的調整操做之後獲得的紅黑樹狀態正好符合狀況五的描述,如圖所示:狀況五描述
如上圖所示,結點2表示新插入的結點N,結點7爲父結點P,結點14爲叔叔結點U,結點11爲祖輩結點G,按照狀況五的操做進行調整,如圖所示:狀況五變換操做

紅黑樹插入總結

經過示例咱們能夠看出,紅黑樹相關狀況之間的關係,狀況三的發生只是一個開始;根據狀況三的調整,可能會產生狀況四但不必定,也有多是會差生狀況三,也有多是狀況五,可是不管是什麼狀況,咱們只要記住對應的情況描述及相關的調整,就能夠對紅黑樹進行調整了。

相關文章
相關標籤/搜索