紅黑二叉查詢樹

2021-09-26 15:26:00 字數 2208 閱讀 5341

紅黑二叉查詢樹背後的基本思想是用標準的二叉查詢樹(完全由2-結點構成)和一些額外的資訊(替換3-結點)來表示2-3樹。我們將樹中的鏈結分為兩種型別:紅鏈結將兩個2-結點鏈結起來構成乙個3-結點,黑鏈結則是2-3樹中的普通鏈結。確切的說,我們將3-結點表示為一條左斜的紅色鏈結(兩個2-結點其中之一是另乙個的左子結點)相連的兩個2-結點,如下圖所示。這種表示法的乙個優點是,我們無須修改就可以直接使用標準二叉查詢樹中的get()方法。對於任意的2-3樹,只要對結點進行轉換,我們都可以立即派生出一顆對應的二叉查詢樹。我們將用這種方式表示2-3樹的二叉查詢樹稱為紅黑二叉查詢樹(簡稱紅黑樹)。

如果我們將一顆紅黑樹中的紅鏈結畫平,那麼所有的空鏈結到根結點的距離都將是相等的。如果我們將由紅鏈結相連的結點合併,得到的就是一顆2-3樹。相反,如果將一顆2-3樹中的3-結點畫作由紅色左鏈結相連的兩個2-結點,那麼不會存在能夠和兩條紅鏈結相連的結點,且樹必然是完美黑色平衡的,因為黑連線即2-3樹中的普通鏈結,根據定義這些鏈結必然是完美平衡的。無論我們選擇用何種方式去定義他們,紅黑樹都既是二叉查詢樹,也是2-3樹。因此,如果我們能夠在保持–對應關係的基礎上實現2-3樹的插入演算法,那麼我們就能夠將兩個演算法的優點結合起來:二叉查詢樹中簡潔高效的查詢方法和2-3樹中高效的平衡插入演算法。

方便起見,因為每個結點都只會有一條指向自己的鏈結(從它的父結點指向它),我們將鏈結的顏色儲存在表示結點的node資料型別的布林變數color中。如果指向它的鏈結是紅色的,那麼該變數為true,黑色的為false。我們約定空鏈結為黑色。為了**的清晰我們定義了兩個常亮red和black來設定和測試這個變數。我們使用提到乙個結點的顏色時,我們指的是指向該結點的鏈結的顏色,反之亦然。

private static final boolean red = true;

private static final boolean black = false;

public class node

}private boolean isred(node x)

return x.color == red;

}

在我們實現的某些操作中可能會出現紅色右鏈結或者兩條連續的紅鏈結,但在操作完成前這些情況都會被小心地旋轉並修復。旋轉操作會改變紅鏈結的指向。首先,假設我們有一條紅色的右鏈結需要被轉化為左鏈結。這個操作叫做左旋轉,它對應的方法接受一條指向紅黑樹中的某個結點作為引數。假設被指向的結點的右鏈結是紅色的,這個方法會對樹進行必要的調整並返回乙個指向包含同一組鍵的子樹且其左鏈結為紅色的根結點的鏈結。尾盤,惡魔只需要將兩個鍵中的較小者作為根結點變為較大者作為根結點。實現將乙個紅色左鏈結轉換為乙個紅色右鏈結的**完全相同,只需要將left換成right即可。

node rotateleft(node h)
無論左旋轉還是右旋轉,旋轉操作都會返回一條鏈結。我們總是用rotateright()或者rotateleft()的返回值重置父結點(或者根結點)中相應的鏈結。返回的鏈結可能是左鏈結也可能是右鏈結,但是我們總會將它賦予父結點中的鏈結。這個鏈結可能是紅色的也可能是黑色的做反轉和有反轉都是通過將x.color設為h.color保留它原來的顏色。這可能會產生兩條連續的紅鏈結,但我們的演算法會繼續用旋轉操作修正這種情況。

再插入新的鍵時我們可以使用旋轉操作幫助我們保證2-3樹和紅黑樹之間的一一對應關係,因為旋轉操作可以保證紅黑樹的兩個重要性質:有序性和完美平衡性。也就是說,我們在紅黑樹中進行旋轉時無需為樹的有序性或者完美平衡性擔心。

一顆只含有乙個鍵的紅黑樹只含有乙個2-結點。插入另乙個鍵之後,我們馬上就需要將他們旋轉。如果新鍵小於老鍵,我們只需要新增乙個紅色的結點即可,新的紅黑樹和單個3-結點完全等價。如果新鍵大於老鍵,那麼新增的紅色結點將會產生一條紅色的右鏈結。我們需要使用root = rotateleft(root);來將其旋轉為紅色左鏈結並修正根結點的鏈結,插入操作才算完成。兩種情況的結果均為一顆和單個3-結點等價的紅黑樹,其中含有兩個鍵,一條紅鏈結,樹的黑鏈高度為1。

永和二叉查詢樹相同的方式向一顆紅黑樹中插入乙個新鍵會在樹的底部新增乙個結點(為了保證有序性),但總是用紅鏈結將新結點和他的父結點相連。如果它的父結點是乙個2-結點,那麼剛才討論的兩種處理方法仍然適用。如果指向新結點的是父結點的左鏈結,那麼父結點就直接稱為了乙個3-結點;如果指向新結點的是父結點的右鏈結,這就是乙個錯誤的3-結點,但一次左旋轉就能修正它。

總的來說,我們通過0次,1次和2次旋轉以及顏色的變化得到了期望的結果。

紅黑二叉查詢樹

擷取自 演算法 第四版 紅黑二叉查詢樹背後的基本思想是用標準二叉查詢樹 完全 由2 節點構成 和 一些額外的資訊 替換 3 節點 來表示 2 3樹。紅黑樹中的鏈結分為兩種 1 將兩個2 節點連線起來 構成3 節點的紅鏈結 2 2 3樹中的普通鏈結為黑鏈結 將兩個 2節點用左斜的紅色鏈結鏈起來可表示3...

紅黑二叉查詢樹

三 各種查詢符號表的效能比較 之前所述的 2 3樹 的插入演算法並不難理解,我們要利用名為紅黑二叉查詢樹的簡單資料結構來表達並實現它。最後的 量並不大。紅黑樹背後的思想是用標準的二叉查詢樹 完全由2 結點構成 和一些額外的資訊 替換3 結點 來表示 2 3樹 對於任意的2 3樹,只要對結點進行轉換,...

二叉查詢樹 紅黑樹

紅黑樹是一棵二叉查詢樹,它在每個結點上增加了乙個儲存位來表示結點的顏色,可以是red或black。通過對任何一條從根到葉子的簡單路徑上各個結點的顏色進行約束,紅黑樹確保沒有一條路徑會比其他路徑長出2倍,因而是近乎於平衡的。樹中每個結點包含5個屬性 color key left right和p。如果乙...