第八節:紅黑樹(初階)

【本節要點】

  • 紅黑樹概念
  • 紅黑樹性質
  • 紅黑樹結點定義
  • 紅黑樹結構
  • 紅黑樹插入操作的分析

一、紅黑樹的概念與性質

1.1 紅黑樹的概念

紅黑樹 ,是一種 二叉搜索樹 ,但 在每個結點上增加一個存儲位表示結點的顏色,可以是 Red和 Black 。 通過對 任何一條從根到葉子的路徑上各個結點著色方式的限制,紅黑樹確保沒有一條路 徑會比其他路徑長出倆倍 ,因而是 接近平衡 的。
紅黑樹構造:[10(黑)] /        \[5(紅)]     [20(黑)]/     \       /     \[3(黑)] [8(黑)] [15(紅)] [25(紅)]/  \    /  \     /  \    /  \NIL NIL  NIL NIL  NIL NIL NIL NIL

1.2 紅黑樹的性質?

  • 1. 每個結點不是紅色就是黑色
  • 2. 根節點是黑色的?
  • 3. 如果一個節點是紅色的,則它的兩個孩子結點是黑色的?
  • 4. 對于每個結點,從該結點到其所有后代葉結點的簡單路徑上,均包含相同數目的黑色結點?
  • 5. 每個葉子結點都是黑色(此處的葉子結點指的是空結點)

?以上五點性質可以保證:其最長路徑中節點個數不會超過最短路徑節點個數的兩倍。

?二、紅黑樹結點定義

// 結點的顏色
enum Colour
{RED,BLACK,
};// 紅黑樹結點的定義
template<class K, class V>
struct RBTreeNode
{pair<K, V> _kv;            // 結點的鍵值對RBTreeNode<K, V>* _left;   // 結點的左孩子RBTreeNode<K, V>* _right;  // 結點的右孩子RBTreeNode<K, V>* _parent; // 結點的雙親(紅黑樹需要旋轉,為了實現簡單所以給出該結點)Colour _col;               // 結點的顏色// 結點的構造函數RBTreeNode(const pair<K, V>& kv):_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _col(RED){}
};

注意:紅黑樹定義結點時,默認結點顏色為紅色,這一設計選擇直接增加紅黑樹的平衡維護效率和整體性能,大大減少時間復雜度。

三、紅黑樹的結構

// 以本數組為例
num[3, 5, 8, 10, 15, 20, 25]
紅黑樹構造:[10(黑)] /        \[5(紅)]     [20(黑)]/     \       /     \[3(黑)] [8(黑)] [15(紅)] [25(紅)]/  \    /  \     /  \    /  \NIL NIL  NIL NIL  NIL NIL NIL NIL

圖示說明

  1. 根結點標記:根結點?10?為黑色,符合性質2(根結點必黑)

  2. 紅色結點規則:紅色結點?51525?的子結點均為黑色,滿足性質3(紅色結點不連續)

  3. 黑高一致性驗證:從根結點到任意 NIL 的路徑黑色結點數均為?2

  4. NIL結點處理:所有葉子結點顯式標記為 NIL(黑色),符合性質5

  5. 最長/最短路徑對比

    路徑類型示例路徑結點數比例
    最短路徑10→20→NIL21:1
    最長路徑10→5→3→NIL31.5:1
    理論極限紅黑交替路徑(未出現)≤4≤2:1

?四、紅黑樹的插入操作

                              [開始插入新結點Z]│▼┌─────────執行標準BST插入─────────┐│                                │▼                                ▼[Z設為紅色]                   [保持BST性質]│▼┌─────父結點P是否為紅色?─────┐│                            │▼ (是)                       ▼ (否)[存在雙紅沖突需處理]               [插入完成]│▼┌────叔結點U的顏色?────┐│                      │▼ (紅色)               ▼ (黑色/NIL)
[Case1: 顏色翻轉]     [判斷沖突結構類型]│                      │▼                      ├─────────────────────────┐
[將P、U設為黑色]           ▼                         ▼│               [Z-P-G呈三角型]            [Z-P-G呈直線型]▼                      │                         │
[將G設為紅色]        [Case2: 旋轉父結點]      [Case3: 旋轉祖父結點]│                      │                         │▼                      ▼                         ▼
[以G為新Z向上回溯]   [轉為直線型沖突]         [交換顏色并旋轉]│▼[調整完成]│▼[最終確保根結點為黑]

4.1?基本BST插入階段

  • 插入位置遵循二叉搜索樹規則

  • 新結點初始顏色必須為紅色(最小化規則破壞)

4.2 沖突檢測階段

  • 要素1:父結點狀態判斷
  • 要素2:叔結點顏色判定
  • 要素3:沖突結構類型識別

4.3??典型場景演練

場景1:叔結點為紅(Case1)

         G(黑)                 G(紅)/   \     顏色翻轉     /   \P(紅) U(紅)  →       P(黑) U(黑)/                   /Z(紅)              Z(紅)

檢測要點

  • 確認U存在且為紅

  • 將沖突標記上移給G

  • 繼續以G作為新Z向上檢測

場景2:叔結點為黑-三角型(Case2)

     G(黑)            G(黑)/               /P(紅)   →      Z(紅)\           /Z(紅)     P(紅)

檢測要點

  • 判斷Z是P的右子結點

  • 識別為三角型沖突

  • 轉換為直線型處理

場景3:叔結點為黑-直線型(Case3)

      G(黑)             P(黑)/               /   \P(紅)   →      Z(紅) G(紅)/Z(紅)

檢測要點

  • 確認Z是P的左子結點

  • 直接觸發祖父旋轉

  • 完成顏色交換

?4.4 總結

沖突檢測階段通過三級條件篩選(父結點狀態→叔結點顏色→沖突結構類型),將復雜的平衡問題分解為可控的局部操作。這種分層檢測機制:

  1. 確保90%以上的插入操作只需1次檢測即可完成
  2. 將最壞情況的時間復雜度嚴格控制在O(log n)
  3. 為后續的旋轉/顏色調整提供精準的操作依據

該設計體現了紅黑樹"以檢測換計算,以分類求高效"的核心優化思想,是其能在大規模數據場景下保持卓越性能的關鍵所在。


以上就是紅黑樹初階知識的了解,接下來我會繼續更新紅黑樹進階紅黑樹的模擬實現、使用紅黑樹底層對map和set容器的模擬實現。制作不易,請大家多多點贊收藏啦!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897844.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序threejs三維開發

微信小程序threejs開發 import * as THREE from three; const { performance, document, window, HTMLCanvasElement, requestAnimationFrame, cancelAnimationFrame, core, Event, Event0 } THREE .DHTML import Stats from three/examples/jsm/libs/stats.module.js; im…

jupyter無法轉換為PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

無法轉為PDF 手動下載工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一樣&#xff0c;還有新的報錯 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意兒 sudo apt-get install texlive-xetex texlive-fon…

關于PLC、電纜線材及氣缸選型的詳細教程

以下是關于PLC、電纜線材及氣缸選型的詳細教程&#xff0c;整合了多個專業來源的核心要點&#xff1a; 一、PLC選型要點 生產廠家選擇 日系PLC&#xff08;如三菱FX系列、歐姆龍CP1系列&#xff09;適合獨立設備或簡單控制系統&#xff0c;性價比高。歐美系PLC&#xff08;如西…

使用 Excel 實現績效看板的自動化

引言 在日常工作中&#xff0c;團隊的績效監控和管理是確保項目順利進行的重要環節。然而&#xff0c;面臨著以下問題&#xff1a; ?數據分散&#xff1a;系統中的數據難以匯總&#xff0c;缺乏一個宏觀的團隊執行情況視圖。?看板缺失&#xff1a;系統本身可能無法提供合適…

02 windows qt配置ffmpeg開發環境搭建

版本說明 首先我使用ffmpeg版本是4.2.1 QT使用版本5.14.2 我選擇是c編譯 在02Day.pro??添加ffmpeg頭?件和庫?件路徑 win32 { INCLUDEPATH $$PWD/ffmpeg-4.2.1-win32-dev/include LIBS $$PWD/ffmpeg-4.2.1-win32-dev/lib/avformat.lib \$$PWD/ffmpeg-4.2.1-win32-dev/l…

Dask:Python高效并行計算利器

Dask&#xff1a;Python高效并行計算利器 Dask是一個開源的Python并行計算庫&#xff0c;旨在擴展Python常用工具&#xff08;如NumPy、Pandas、Scikit-learn等&#xff09;的功能&#xff0c;使其能夠處理更大規模的數據集和更復雜的計算任務。它通過動態任務調度和分布式計算…

掌握市場先機:9款銷售渠道管理工具深度測評

本文主要介紹了以下9款銷售渠道管理工具&#xff1a;1.紛享銷客&#xff1b; 2.銷幫幫&#xff1b; 3.小滿CRM&#xff1b; 4.有贊&#xff1b; 5.Oracle NetSuite&#xff1b; 6.Salesforce Sales Cloud&#xff1b; 7.Cin7&#xff1b; 8.Pipedrive&#xff1b; 9.BigCommerc…

C語言基礎知識04

指針 指針概念 指針保存地址&#xff0c;地址是字節的編號 指針類型和保存的地址類型要一直 使用時注意&#xff0c;把地址轉換為&變量的格式來看 int a[3]; a轉為&a[0] 指針的大小 64bit 固定8字節&#xff0c; 32bit 固定4字節 指針…

計算矩陣邊緣元素之和(信息學奧賽一本通-1121)

【題目描述】 輸入一個整數矩陣&#xff0c;計算位于矩陣邊緣的元素之和。所謂矩陣邊緣的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 【輸入】 第一行分別為矩陣的行數m和列數n&#xff08;m<100&#xff0c;n<100&#xff09;&#xff0c…

異常(9)

大家好,今天我們來詳細介紹一下異常拋出的知識,在編寫程序時,如果程序中出現錯誤,此時就需要將錯誤的信息告知給調用者,話不多說,來看. 在java中,可以借助throw關鍵字,拋出一個指定的異常對象,將錯誤對象告知給調用者,具體語法如下&#xff1a; throw new xxx("異常產生…

網絡安全就業形勢

網絡安全是一個日益增長的行業&#xff0c;對于打算進入或轉行進入該領域的人來說&#xff0c;制定一個清晰且系統的職業規劃非常重要。2025年&#xff0c;網絡安全領域將繼續發展并面臨新的挑戰&#xff0c;包括不斷變化的技術、法規要求以及日益復雜的威脅環境。 第一部分&am…

3U VPX 國產化板卡FT6678+V7 690T

板卡1、 采用標準3U VPX架構&#xff0c;板上集成1片深圳國微電子SMQ7V690TFFG1761&#xff08;pin-to-pin兼容Xilinx的XC7VX690T-2FFG1761I&#xff09;FPGA&#xff0c;1片國防科大FT-M6678&#xff08;功能兼容TI的TMS320C6678&#xff09;&#xff0c;對外接口RS422、網口…

【數據結構】-哈夫曼樹以及其應用

哈夫曼樹&#xff08;Huffman Tree&#xff09; 1. 哈夫曼樹的定義 哈夫曼樹&#xff08;Huffman Tree&#xff09;是一種 帶權路徑長度最短的二叉樹&#xff0c;常用于數據壓縮和最優前綴編碼。其目標是使得 帶權路徑長度&#xff08;WPL&#xff09;最小。 在信息論和計算…

Linux 命名管道

文章目錄 &#x1f680; 深入理解命名管道&#xff08;FIFO&#xff09;及其C實現一、命名管道核心特性1.1 &#x1f9e9; 基本概念 二、&#x1f4bb; 代碼實現解析2.1 &#x1f4c1; 公共頭文件&#xff08;common.hpp&#xff09;2.2 &#x1f5a5;? 服務器端&#xff08;s…

sap 內存管理與數據共享方式

SAP內存管理 內存是程序之間為了傳遞數據而使用的共享存儲空間 SAP內存分類&#xff1a;1、SAP內存&#xff0c;2、ABAP內存 這兩種內存都是針對同一登錄用戶實現數據共享。 SAP內存&#xff08;SAP Memory&#xff09;和ABAP內存&#xff08;ABAP Memory&#xff09;&…

數據結構與算法(哈希表——兩個數組的交集)

原題 349. 兩個數組的交集 - 力扣&#xff08;LeetCode&#xff09; 給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 […

python筆記2

變量&#xff1a;含義 一個容器&#xff0c;計算機當中的存儲空間。 可以理解為一個用于標識或引用數據的名字或標簽。 作用&#xff1a; 可以通過定義一個變量來給需要使用多次的數據命名&#xff0c;就像一個標簽一樣。下次需要使用這個數據時&#xff0c;只需要通過這個變…

【Linux系統編程】信號

目錄 1、信號1.1、什么是信號1.2、進程對信號的處理1.3、信號的生命周期1.4、信號處理流程1.5、信號的發送 2、kill()、raise()函數 發送信號3、alarm函數 鬧鐘信號4、pause函數 掛起信號、暫停5、singal 函數 捕獲信號5.1、為什么返回值是上一次的處理方式5.2、練習 6、sigact…

實用小工具——快速獲取數據庫時間寫法

最近我遇到了一個比較棘手的問題&#xff1a;在工作中&#xff0c;各個項目所使用的數據庫類型各不相同。這導致我習慣性地使用Oracle的SQL語句進行編寫&#xff0c;但每次完成后都會遇到報錯&#xff0c;最終才意識到項目的數據庫并非Oracle。為了避免這種情況&#xff0c;我需…

數據類型及sizeof,進制轉換

其實數據類型可以講很多內容&#xff0c;這里看情況需要講多久吧。 本篇基本都是理論。 目錄 數據類型的分類 基本數據類型 構造數據類型 指針類型 空類型 計算數據類型或變量所占用的內存字節數 基本語法 進制轉換 二進制 二進制的概念 二進制與十進制的轉換 十六進…