紅黑樹總結

2021-07-24 12:36:28 字數 3051 閱讀 7566

r-b tree,全稱是red-black tree,又稱為「紅黑樹」,它一種特殊的二叉查詢樹。紅黑樹的每個節點上都有儲存位表示節點的顏色,可以是紅(red)或黑(black)。

r-b tree,全稱是red-black tree,又稱為「紅黑樹」,它一種特殊的二叉查詢樹。紅黑樹的每個節點上都有儲存位表示節點的顏色,可以是紅(red)或黑(black)。

紅黑樹的特性:

(1)每個節點或者是黑色,或者是紅色。

(2)根節點是黑色。

(3)每個葉子節點(nil)是黑色。 [注意:這裡葉子節點,是指為空(nil或null)的葉子節點!]

(4)如果乙個節點是紅色的,則它的子節點必須是黑色的。

(5)從乙個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。

注意:

(01) 特性(3)中的葉子節點,是只為空(nil或null)的節點。

(02) 特性(5),確保沒有一條路徑會比其他路徑長出倆倍。因而,紅黑樹是相對是接近平衡的二叉樹。

紅黑樹的時間複雜度為: o(lgn)
下面通過「數學歸納法」對紅黑樹的時間複雜度進行證明。

定理:一棵含有n個節點的紅黑樹的高度至多為2log(n+1).

證明:

「一棵含有n個節點的紅黑樹的高度至多為2log(n+1)」 的逆否命題是 「高度為h的紅黑樹,它的包含的內節點個數至少為 2^-1個」。

我們只需要證明逆否命題,即可證明原命題為真;即只需證明 「高度為h的紅黑樹,它的包含的內節點個數至少為 2^-1個」。

從某個節點x出發(不包括該節點)到達乙個葉節點的任意一條路徑上,黑色節點的個數稱為該節點的黑高度,記為bh(x)。

由紅黑樹的」特性(4)」可知 bh(x)>=h/2;進而,我們只需證明 「高度為h的紅黑樹,它的包含的內節點個數至少為 2^bh(x)-1個」即可。

到這裡,我們將需要證明的定理已經由」一棵含有n個節點的紅黑樹的高度至多為2log(n+1)」 轉變成只需要證明」高度為h的紅黑樹,它的包含的內節點個數至少為 2^bh(x)-1個」。

下面通過」數學歸納法」開始論證高度為h的紅黑樹,它的包含的內節點個數至少為 2^bh(x)-1個」。

(01) 當樹的高度h=0時,內節點個數是0,bh(x) 為0,2^bh(x)-1 也為 0。顯然,原命題成立。

(02) 當h>0,且樹的高度為 h-1 時,它包含的節點個數至少為 2^-1。這個是根據(01)推斷出來的!

下面,由樹的高度為 h-1 的已知條件推出「樹的高度為 h 時,它所包含的節點樹為 2^bh(x)-1」。

當樹的高度為 h 時,

對於節點x(x為根節點),其黑高度為bh(x)。

對於節點x的左右子樹,它們黑高度為 bh(x) 或者 bh(x)-1。

根據(02)的已知條件,我們已知 「x的左右子樹,即高度為 h-1 的節點,它包含的節點至少為 2^-1 個」;

所以,節點x所包含的節點至少為 ( 2^-1 ) + ( 2^-1 ) + 1 = 2^。即節點x所包含的節點至少為 2^ 。

因此,原命題成立。

由(01)、(02)得出,」高度為h的紅黑樹,它的包含的內節點個數至少為 2^bh(x)-1個」。因此,「一棵含有n個節點的紅黑樹的高度至多為2log(n+1)」。

left-rotate(t, x)  

01 y ← right[x] // 前提:這裡假設x的右孩子為y。下面開始正式操作

02 right[x] ← left[y] // 將 「y的左孩子」 設為 「x的右孩子」,即 將β設為x的右孩子

03 p[left[y]] ← x // 將 「x」 設為 「y的左孩子的父親」,即 將β的父親設為x

04 p[y] ← p[x] // 將 「x的父親」 設為 「y的父親」

05if p[x] = nil[t]

06 then root[t] ← y // 情況1:如果 「x的父親」 是空節點,則將y設為根節點

07else

if x = left[p[x]]

08 then left[p[x]] ← y // 情況2:如果 x是它父節點的左孩子,則將y設為「x的父節點的左孩子」

09else right[p[x]] ← y // 情況3:(x是它父節點的右孩子) 將y設為「x的父節點的右孩子」

10 left[y] ← x // 將 「x」 設為 「y的左孩子」

11 p[x] ← y // 將 「x的父節點」 設為 「y」

right-rotate(t, y)  

01 x ← left[y] // 前提:這裡假設y的左孩子為x。下面開始正式操作

02 left[y] ← right[x] // 將 「x的右孩子」 設為 「y的左孩子」,即 將β設為y的左孩子

03 p[right[x]] ← y // 將 「y」 設為 「x的右孩子的父親」,即 將β的父親設為y

04 p[x] ← p[y] // 將 「y的父親」 設為 「x的父親」

05if p[y] = nil[t]

06 then root[t] ← x // 情況1:如果 「y的父親」 是空節點,則將x設為根節點

07else

if y = right[p[y]]

08 then right[p[y]] ← x // 情況2:如果 y是它父節點的右孩子,則將x設為「y的父節點的左孩子」

09else left[p[y]] ← x // 情況3:(y是它父節點的左孩子) 將x設為「y的父節點的左孩子」

10 right[x] ← y // 將 「y」 設為 「x的右孩子」

11 p[y] ← x // 將 「y的父節點」 設為 「x」

紅黑樹總結

關鍵特點 1 根是黑色 2 null是黑色 3 沒有相連的紅色 4 乙個節點到null所有路徑上所有黑色節點數量相等 最高高度2log n 1 最壞時間複雜度log n 插入 自底向上插入 需要用乙個棧儲存搜尋路徑經歷過的節點。1 按照二叉搜尋樹插入,新插入點為紅色。2 如果新插入節點的父親是黑色,...

紅黑樹總結

節點是紅色或黑色 根節點是黑色 不能有連續的兩個紅色節點。從任一節點到其每個葉子的簡單路徑都包含相同數目的黑色節點 由上面的性質4可以得到,紅黑樹中新插入的節點必須是紅色節點。先按照二叉搜尋樹的插入方式,找到合適的插入位置。並且插入的節點應為紅色。如果新插入節點的父節點本身就是紅色,就和性質3發生了...

紅黑樹知識總結

紅黑樹 red black tree 是一種自平衡二叉查詢樹,所有資料塊都儲存在節點中,在進行插入和刪除操作時通過特定操作保持二叉查詢樹的平衡,從而獲得較高的查詢效能,它雖然是複雜的,但它的最壞情況執行時間也是非常良好的,並且在實踐中是高效的 它可以在o log n 時間內做查詢,插入和刪除,這裡的...