紅黑樹介紹及旋轉詳解

2022-06-18 07:39:11 字數 3000 閱讀 9337

一、二叉查詢樹(二叉查詢樹、二叉搜尋樹 )

二叉排序樹(binary sort tree)或者是一棵空樹;或者是具有下列性質的二叉樹:

1.若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

2.若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

3.左、右子樹也分別為二叉排序樹;

4.沒有鍵值相等的節點 

二、紅黑樹

紅黑樹,一種二叉查詢樹,但在每個結點上增加乙個儲存位表示結點的顏色,可以是red或black。通過對任何一條從根到葉子的路徑上各個結點著色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出倆倍,因而是接近平衡的。

因為一棵由n個結點隨機構造的二叉查詢樹的高度為lgn,所以順理成章,二叉查詢樹的一般操作的執行時間為o(lgn)。但二叉查詢樹若退化成了一棵具有n個結點的線性鏈後,則這些操作最壞情況執行時間為o(n)。

紅黑樹雖然本質上是一棵二叉查詢樹,但它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢、插入、刪除的時間複雜度最壞為o(log n),為了保證這個性質,所以紅黑樹有以下幾個特性:

1.每個結點要麼是紅的要麼是黑的。

2.根結點是黑的。  

3.每個葉結點(葉結點即指樹尾端nil指標或null結點)都是黑的。  

4.如果乙個結點是紅的,那麼它的兩個兒子都是黑的。  

5. 對於任意結點而言,其到葉結點樹尾端nil指標的每條路徑都包含相同數目的黑結點。 

三、紅黑樹的旋轉

紅黑樹的基本操作是新增、刪除。在對紅黑樹進行新增或刪除之後,都會用到旋轉方法。為什麼呢?道理很簡單,新增或刪除紅黑樹中的節點之後,紅黑樹就發生了變化,可能不滿足紅黑樹的5條性質,也就不再是一顆紅黑樹了,而是一顆普通的樹。而通過旋轉,可以使這顆樹重新成為紅黑樹。簡單點說,旋轉的目的是讓樹保持紅黑樹的特性。旋轉包括兩種:左旋和右旋。如下圖所示:

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的父親」

05 if p[x] = nil[t]

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

07 else if x = left[p[x]]

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

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

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

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

示例:

2.右旋轉

右旋的動態圖與靜態圖如下所示:左邊為右旋前,右邊為旋轉後

右旋轉的偽**如下

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的父親」

05 if p[y] = nil[t]

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

07 else if y = right[p[y]]

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

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

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

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

示例:

紅黑樹 旋轉

此篇部落格我們討論紅黑樹的旋轉 左旋和右旋 為了更好的理解旋轉,我們只關注紅黑樹中關於二叉查詢樹部分的規則,而不關注紅黑樹中關於本身紅黑樹定義部分的規則。左旋現有紅黑樹結構如下 為了更好的理解,我們給節點x y a b和c乙個值,並把要進行左旋的節點x標為紅色 注意 和紅黑樹的紅色沒關係,僅僅起乙個...

詳解紅黑樹

1.節點都有顏色 2.在插入和刪除的過程中,要遵循儲存這些顏色不同排列的規則。帶顏色的節點 在紅 黑樹中,每乙個節點或者是黑色的或者是紅色的。當然也可以是任意的兩種顏色 紅 黑規則 當插入或者刪除乙個新節點時,必須遵循一定的規則。它們被稱為紅 黑規則。遵循這些規則,樹就是平衡的。這些規則是 每乙個節...

紅黑樹詳解

在這片文章 裡講到了二叉查詢樹,很好很棒,就是有乙個缺點,當根節點最大或最小時,會出現單腿情況,最差成了鍊錶。於是乎,就是誕生了紅黑樹。紅黑樹是一種平衡樹,但是不追求絕對的平衡 追求絕對的平衡會費時費資源 追求一定的平衡。2.紅黑樹的生成規則 1 把二叉樹所以節點先弄成紅色 2 根據紅黑樹的性質 生...