理解進階資料結構(二):AVL樹 |紅黑樹

更新於 發佈於 閱讀時間約 7 分鐘

前一篇提到B樹和B+樹,這篇介紹AVL 樹和經典的紅黑樹。

在開始之前,可以看個輕鬆的影片,對於紅黑樹在真實商業案例的應用更有印象

學習資料結構、演算法在工作上真的有用嗎? 實際工作經歷不藏私! | 二元樹 | 雜湊 | 計算機概論 | 工程師 Nic


AVL Tree 資料結構

AVL tree 也是一種二元搜尋自平衡樹 Binary Search Tree (BST) ,他的名字由來是由Georgy Adelson-Velsky 和 Evgenii Landis 兩位共同發表,故稱 AVL 樹。

  • 特性:當樹失去平衡(左右子節點的高度差超過 1),AVL 樹會自動透過旋轉操作進行調整,維持樹的平衡性。
  • 限制與規則:在每個插入或刪除操作後,必須檢查並維持樹的平衡,透過「左旋」、「右旋」、「左右旋」和「右左旋」來重新調整高度。每個節點的左右子樹高度差不能超過 1。
  • 應用:例如通訊錄管理、遊戲排行榜等,因為高度平衡的結構可以確保查找效率。

AVL 的操作

子樹們的旋轉方式:

  1. 左旋 Left Rotation:

如果在右邊新增資料,使整個樹不平衡,樹就會啟動左旋模式。

raw-image



  1. 右旋 Right Rotation:

如果新增的資料是向左偏移,已違反節點左右正負 1 的原則,就必須向右旋轉。

raw-image


  1. 左右旋 Left-Right Rotation:

在沒有偏向任何一邊的情況下,但是左右子節點的高度差超過 1 先將最下面偏右的節點往右,再把往左旋轉。


raw-image


  1. 右左旋 Right-Left Rotation:
raw-image


AVL 樹的優點:

  1. 不管是搜尋、刪除、新增的時間複雜度都是 O(Log n) 。
  2. 自平衡的條件限制比紅黑樹更嚴苛,AVL 樹通常高度較低,搜尋速度也較快。
  3. AVL 樹比紅黑樹更容易理解跟應用。

AVL 樹的缺點:

  1. 比一般的二元搜尋樹難應用(但比紅黑樹簡單)。
  2. 在業界實務的頻率比紅黑樹少。
  3. 因為限制條件嚴苛,所以新增跟刪除資料要大規模變化樹的形狀。

AVL 樹的應用:

  1. 教學用XD 因為 AVL 樹相較紅黑樹較容易讓學生理解,所以是資料庫的入門課程
  2. 需要頻繁查找數據以及執行其他二元搜尋樹(BST)的操作,例如有序遍歷( Sorted Traversal)最小值和最大值時,可以考慮使用這些結構。Sorted Traversal(有序遍歷)指的是按照數據從小到大(或從大到小)的順序來遍歷二元搜尋樹(BST, Binary Search Tree)中的所有節點。
  3. 紅黑樹較常用於程式語言的標準函式庫中,例如 C++ 中的 mapset,以及 Java 中的 TreeMapTreeSet
  4. AVL 樹則適合應用在對即時性有要求的場景,這些場景需要預測性和穩定的性能表現。

紅黑樹 Red-Black Tree

前面一直拿紅黑樹跟 AVL 樹比較,到底什麼是紅黑樹呢?

Red-black trees in 4 minutes — Intro

raw-image
  • 特性:紅黑樹是一種二元搜尋樹,透過標記每個節點為紅或黑色,並維持特定規則以保持樹的平衡。
  • 限制與規則:紅黑樹遵守五個紅黑規則:
    1. 每個節點(node)是紅色或黑色。
    2. Root 和 Leaves(NIL 或 NULL 節點)必為黑色。
    3. 若節點為紅色,其子節點必為黑色(不允許兩個紅色節點相連)。
    4. 從任何節點到葉節點(NIL 或 NULL節點)的每條路徑,必須包含相同數目的黑色節點。
  • 應用:由於其快速調整和查找性能,紅黑樹被應用於需要頻繁查找與插入的場景,例如 Java 的 TreeMap、操作系統排程和網路應用中的快速數據存取。

注意:在紅黑樹中,leaf (葉)是指 NULL 而非數字 1、3、5、7、8 哦。

限制和規格的範例

下圖就是符合規則的紅黑樹

raw-image


我們來用 Red-black trees in 5 minutes — Insertions (strategy)

這部影片來解釋紅黑樹是如何插入資料的 (刪除太難了QQ 我這篇先暫時不提)

插入資料 Z (假定是紅色)

Z 的父母節點是 A 叔叔是 D (請先記住這個關係)

raw-image

咦~~ Z 跟 A 都是紅色,這樣違反規則。會有四種情況讓我們重新塗色跟調整

Z 是 Root (根)

  • 直接把 Z 塗黑就好

Z 的 uncle 是紅色

  • 把所有人都改變顏色
raw-image


Z 的 uncle 是黑色 (三角形)

raw-image


Z 的 uncle 是黑色(一條線)

要旋轉祖父母節點,再用父母節點取代。

raw-image

最後,需要再重新塗原父母和祖父母節點的顏色。

raw-image

紅黑樹的優點:

  • 自平衡: 插入、刪除、搜尋的時間複雜度皆是 O(log n) 。
  • 容易應用: 規則限制簡單,所以在實務上廣泛被應用。
  • 應用廣泛: 許多的資料結構、地圖使用紅黑樹的概念。

紅黑樹的缺點:

  • 較難被初學者理解: 相較於 AVL 樹, 紅黑樹的刪除規則較難理解。
  • 額外的負擔 Constant overhead: 維持紅黑樹需要額外的操作(例如變更節點顏色、旋轉子樹等)
  • 並非所有情況都是最佳解:雖然紅黑樹在大多數操作中效率高,但對於需要頻繁插入和刪除的應用場景來說,紅黑樹可能不是最佳選擇,因為這些額外負擔在頻繁操作下會變得明顯。

紅黑樹的應用:

  • 應用在集合(Set)、Map (key-value pair)的結構
    • Map 是一種鍵值對(key-value pair)的結構,例如 { "apple": 1, "banana": 2 }
    • Set 只儲存唯一元素,像 {1, 2, 3}
  • Priority Queues(優先佇列): 造優先程度處理,並非誰先到誰先處理。
  • 檔案管理系統
  • In-memory Databases(記憶體資料庫)

 資料存在RAM(隨機存取記憶體)中,而不是儲存在硬碟上。這樣做的好處是讀寫速度非常快,因為 RAM 的速度遠高於硬碟。然而,由於 RAM 的容量有限且斷電後資料會消失,in-memory 資料庫適合用於需要快速存取資料的情況。

  • 圖像跟遊戲開發
留言
avatar-img
留言分享你的想法!
avatar-img
越南放大鏡 X 下班資工系
14會員
61內容數
雙重身份:越南放大鏡 X 下班資工系 政大東南亞語言學系是我接觸越南語的起點,畢業後找越南外派工作的生活跟資訊時,發現幾乎都是清單式的分享,很難身歷其境。所以我希望「越南放大鏡」可以帶讀者看到更多細節和深入的觀察。 - 下班資工系則是自學資工系的課程內容,記錄實際操作的過程,學習理論的過程。希望可以跟讀者一起成長。
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
Thumbnail
這篇文章,會帶著大家複習以前學過的二元搜尋樹(Binary Search Tree)框架, 並且以二分搜尋樹的概念與定義為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 二元搜尋樹(Binary Search Tree)的定義
Thumbnail
這篇文章,會帶著大家複習以前學過的二元搜尋樹(Binary Search Tree)框架, 並且以二分搜尋樹的概念與定義為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 二元搜尋樹(Binary Search Tree)的定義
Thumbnail
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
Thumbnail
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
Thumbnail
題目敘述 題目會給我們一棵二元搜索樹的根結點root,還有一個指定的目標值val。 要求我們找出在樹中對應到目標值val的節點,假如找不到,請回傳null( null在Python就是None)。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,
Thumbnail
題目敘述 題目會給我們一棵二元搜索樹的根結點root,還有一個指定的目標值val。 要求我們找出在樹中對應到目標值val的節點,假如找不到,請回傳null( null在Python就是None)。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
Thumbnail
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
Thumbnail
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
Thumbnail
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
Thumbnail
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News