iT邦幫忙

2023 iThome 鐵人賽

DAY 19
1

什麼是紅黑樹

紅黑樹(Red-Black Tree)是一種自平衡的二元搜尋樹,在確保在最壞情況下的查找、插入和刪除操作的時間複雜度保持在O(log N)水平,其中N是樹中節點的數量。它之所以得名紅黑樹,是因為每個節點都帶有顏色(紅色或黑色),並滿足一組紅黑樹性質,這些性質確保樹的平衡性。


基本性質

紅黑樹的基本性質包括:

  1. 根節點始終是黑色的。
  2. 所有葉子節點(NIL節點)都是黑色的。
  3. 如果一個節點是紅色的,那麼它的兩個子節點都是黑色的。
  4. 任意一條從根節點到葉子節點的路徑上,黑色節點的數量必須相同,以確保樹的平衡性。

基本操作

二元搜尋樹轉紅黑樹

步驟一:插入所有節點

首先,將所有節點按照二元搜尋樹的方式插入到樹中,保持它們的鍵值排序順序。在這個階段,不需要考慮紅黑樹性質,只需確保保持二元搜尋樹的性質即可。

步驟二:重新染色

一旦所有節點都插入到樹中,需要進行染色操作來確保滿足紅黑樹的性質:

  1. 首先,將所有節點的顏色都初始化為紅色,除了根節點,它必須是黑色的。
  2. 接著,遍歷整個樹的每個節點,根據規則進行染色操作,以確保紅黑樹的性質得以滿足。
  3. 如果一個節點的父節點是黑色,那麼不需要進行任何操作
  4. 如果一個節點的父節點是紅色,且其叔叔節點(即父節點的兄弟節點)也是紅色,則需要進行染色操作以保持平衡。
    • 首先,將父節點和叔叔節點都染成黑色。
    • 然後,將祖父節點染成紅色。
    • 最後,向上遞歸執行相同的操作,以確保不違反紅黑樹的性質。
  5. 如果一個節點的父節點是紅色,但其叔叔節點是黑色或NIL節點,則可能需要進行旋轉操作,以恢復平衡。根據情況,可以進行左旋、右旋、左右旋或右左旋等操作。

步驟三:確保樹的平衡性

最終,確保紅黑樹的性質得到滿足,並確保整棵樹保持平衡。至此,你已成功地將一個普通的二元搜尋樹轉換為紅黑樹。


搜尋

在紅黑樹中,搜尋操作與普通的二元搜尋樹相同,只需按照二元搜尋的規則在紅黑樹中進行搜尋。由於紅黑樹保持了平衡,查找操作的時間複雜度是O(log N),其中N是樹中節點的數量。


插入

  1. 將新節點插入樹中,並將其顏色設置為紅色。
  2. 檢查是否違反了紅黑樹的性質,如果父節點是黑色,則無需進行操作。
  3. 如果父節點是紅色,則需要進行修復:
    • 如果父節點的兄弟節點也是紅色,則調整顏色以恢復平衡。
    • 如果父節點的兄弟節點是黑色或NIL節點,則進行旋轉操作來恢復平衡。

刪除

1.根據二元搜尋樹的規則刪除目標節點

如果要從紅黑樹中刪除一個節點,首先按照二叉搜索樹的規則找到目標節點,然後根據不同的情況進行操作。

2. 處理紅色節點的情況

如果要刪除的節點是紅色的,不會對紅黑樹的性質造成影響,因此無需額外操作。紅黑樹的性質仍然保持完整。

3. 處理黑色節點的情況

如果要刪除的節點是黑色的,則需要進行修復操作,以處理可能產生的平衡問題。這一過程可能包括旋轉和重新染色等操作,以確保樹仍然滿足紅黑樹的性質。

4. 找到要刪除的節點的後繼或前驅節點

如果要刪除的節點有兩個子節點,需要找到它的後繼或前驅節點來取代它。後繼節點是大於該節點的最小節點,前驅節點是小於該節點的最大節點。

5. 複製後繼或前驅節點的值到要刪除的節點

將後繼或前驅節點的值複製到要刪除的節點,這樣原來的節點就被成功取代了。

6. 刪除後繼或前驅節點

最後,刪除後繼或前驅節點,因為它們已經完成了替代原節點的工作

7. 處理黑色節點的修復操作

如果要刪除的節點是黑色的,且有一個黑色子節點,則可能會導致某些路徑上的黑色節點數目不平衡。在這種情況下,需要進行刪除修復操作,以確保黑色節點數量的平衡。

刪除操作是紅黑樹中複雜且重要的一部分,通過遵循以上步驟,可以確保樹的性質仍然得以維護,並保持平衡。這確保了紅黑樹在各種操作中都能保持高效和可預測的性能。


優缺點

優點

  • 紅黑樹保持平衡性,確保查找、插入和刪除操作的時間複雜度維持在O(log N)水平,這在動態數據結構中非常重要。
  • 它提供了可預測的性能,不論數據如何分佈,都能保持高效。
  • 紅黑樹的操作相對複雜,但一旦建立,能夠快速響應各種查詢,特別適用於需要高效搜索和排序的情況。

缺點

  • 插入和刪除操作可能相對複雜,需要進行額外的旋轉和重新染色操作,這可能使代碼變得複雜且容易出錯。
  • 紅黑樹的儲存需求較高,因為每個節點需要存儲額外的顏色信息。
  • 雖然紅黑樹在大多數情況下表現出色,但對於特定的數據分佈,可能會存在其他自平衡樹結構表現更好的情況。

總結

儘管紅黑樹具有可預測的性能和高效的操作,但它的實現可能相對複雜,且需要額外的存儲空間。此外,對於某些特定的數據分佈,其他自平衡樹結構可能表現更優。總的來說,紅黑樹是一種強大的數據結構,能夠應對多種應用場景,並確保高效的數據操作。



上一篇
資料結構 — AVL樹(AVL Tree)
下一篇
資料結構 — B樹(B-tree)
系列文
30天冒險之旅: 資料結構與演算法筆記挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言