數據結構第八節:紅黑樹(初階)

【本節要點】

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

一、紅黑樹的概念與性質

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/pingmian/71980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71980.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71980.shtml

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

相關文章

Spring Boot3.3.X整合Mybatis-Plus

前提說明&#xff1a; 項目的springboot版本為&#xff1a;3.3.2 需要整合的mybatis-plus版本&#xff1a;3.5.7 廢話不多說&#xff0c;開始造吧 1.準備好數據庫和表 2.配置全局文件application.properties或者是application.yml&#xff08;配置mapper的映射文件路徑&am…

可視化圖解算法:鏈表指定區間反轉

1. 題目 描述 給你單鏈表的頭指針 head 和兩個整數 left 和 right &#xff0c;其中 left < right 。請你反轉從位置 left 到位置 right 的鏈表節點&#xff0c;返回 反轉后的鏈表 。 示例1 輸入&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], left 2, right 4 輸…

?SQL-遞歸CTE

&#x1f4d6; SQL魔法課堂&#xff1a;CTE「時間折疊術」全解 &#x1f3a9; 第一章&#xff1a;什么是CTE&#xff1f; CTE&#xff08;Common Table Expression&#xff09; 就像 SQL 里的「臨時筆記本」&#x1f4d2;&#xff1a; WITH 臨時筆記本 AS ( SELECT ... FRO…

Cursor 新手入門使用教程

一、Cursor 是什么&#xff1f; Cursor 是一個集成了 GPT-4、Claude 3.5 等先進 LLM&#xff08;大語言模型&#xff09;的類 VSCode 編譯器&#xff0c;可以理解為在 VSCode 中集成了 AI 輔助編程助手。從界面布局來看&#xff0c;Cursor 與 VSCode 基本一致&#xff0c;且使…

如何在Spring Boot中配置和使用MyBatis-Plus

在當今的Java開發中&#xff0c;Spring Boot已經成為了一個非常流行的框架&#xff0c;而MyBatis-Plus則是一個強大的ORM框架&#xff0c;為開發人員提供了更簡便的數據庫操作方式。很多開發者都在使用Spring Boot和MyBatis-Plus的組合來快速構建高效的應用。今天就來聊聊如何在…

【貪心算法3】

力扣1005.k次取反后最大化的數組和 鏈接: link 思路 既然要求最大和&#xff0c;那么不妨先給數組排個序&#xff0c;如果有負數&#xff0c;先處理負數從前往后給數組取反&#xff0c;如果負數處理完后k還有次數&#xff0c;此時數組全是正數了&#xff0c;只需要對第一個元…

自然語言處理中的語音識別技術:從聲波到語義的智能解碼

引言 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是自然語言處理&#xff08;NLP&#xff09;的關鍵分支&#xff0c;旨在將人類語音信號轉化為可處理的文本信息。隨著深度學習技術的突破&#xff0c;語音識別已從實驗室走向日常生活&#xff0c;賦能…

1688店鋪所有商品數據接口詳解

??一、接口概述淘寶開放平臺提供 1688.items.onsale.get/taobao.item_search_shop 接口&#xff0c;可批量獲取店鋪在售商品列表&#xff0c;包含商品 ID、標題、價格、銷量、圖片等核心信息。該接口適用于商品庫管理、競品監控、數據分析等場景 ?二、接口調用流程 前期準…

ArduPilot開源代碼之AP_OSD

ArduPilot開源代碼之AP_OSD 1. 源由2. 簡介3. 補丁4. 框架設計4.1 啟動代碼 (AP_OSD::init)4.2 任務代碼 (AP_OSD::osd_thread)4.3 實例初始化 (AP_OSD::init_backend) 5. 重要例程5.1 AP_OSD::update_stats5.2 AP_OSD::update_current_screen5.3 AP_OSD::update_osd 6. 總結7.…

qt open3dAlpha重建

qt open3dAlpha重建 效果展示二、流程三、代碼效果展示 二、流程 創建動作,鏈接到槽函數,并把動作放置菜單欄 參照前文 三、代碼 1、槽函數實現 void on_actionAlpha_triggered();//alpha重建 void MainWindow::

Deepseek可以通過多種方式幫助CAD加速工作

自動化操作&#xff1a;通過Deepseek的AI能力&#xff0c;可以編寫腳本來自動化重復性任務。例如&#xff0c;使用Python腳本調用Deepseek API&#xff0c;在CAD中實現自動化操作。 插件開發&#xff1a;結合Deepseek進行二次開發&#xff0c;可以創建自定義的CAD插件。例如&a…

Centos的ElasticSearch安裝教程

由于我們是用于校園學習&#xff0c;所以最好是關閉防火墻 systemctl stop firewalld systemctl disable firewalld 個人喜歡安裝在opt臨時目錄&#xff0c;大家可以隨意 在opt目錄下創建一個es-standonely-docker目錄 mkdir es-standonely-docker 進入目錄編輯yml文件 se…

c++ 調用 gurobi 庫,cmake,mac

gurobi 一般使用 python 調用&#xff0c;官方的培訓會議及資料大部分也都基于 python。 由于最近上手了 c&#xff0c;因此想試試 c 怎么調用 gurobi。但我發現&#xff0c;c 調用第三方庫比 python 或 java 要復雜不少。python 中直接 import 第三方庫&#xff0c;java 加載…

Python基于Django的醫用耗材網上申領系統【附源碼、文檔說明】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

Python中很常用的100個函數整理

Python 內置函數提供了強大的工具&#xff0c;涵蓋數據處理、數學運算、迭代控制、類型轉換等。本文總結了 100 個常用內置函數&#xff0c;并配備示例代碼&#xff0c;提高編程效率。 1. abs() 取絕對值 print(abs(-10)) # 10 2. all() 判斷所有元素是否為真 print(all([…

Python畢業設計選題:基于django+vue的疫情數據可視化分析系統

開發語言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;PyCharm 系統展示 管理員登錄 管理員功能界面 用戶管理 員工管理 疫情信息管理 檢測預約管理 檢測結果…

C#程序結構及基本組成說明

C# 程序的結構主要由以下幾個部分組成,以下是對其結構的詳細說明和示例: 1. 基本組成部分 命名空間 (Namespace) 用于組織代碼,避免命名沖突。通過 using 引入其他命名空間。 using System; // 引入 System 命名空間類 (Class) C# 是面向對象的語言,所有代碼必須定義在類或…

Python 編程題 第八節:字符串變形、壓縮字符串、三個數的最大乘積、判定字符是否唯一、IP地址轉換

字符串變形 swapcase()方法將字符串大小寫轉換&#xff1b;split()方法將字符串以括號內的符號分隔并以列表形式返回 sinput() ls.split(" ") ll[::-1] s"" for i in l:ai.swapcase()sas" " print(s[0:len(s)-1]) 壓縮字符串 很巧妙的方法 …

大語言模型學習--向量數據庫基礎知識

1.向量 向量是多維數據空間中的一個坐標點。 向量類型 圖像向量 文本向量 語音向量 Embedding 非結構化數據轉換為向量過程 通過深度學習訓練&#xff0c;將真實世界離散數據&#xff0c;投影到高維數據空間上&#xff0c;通過數據在空間中間的距離體現真實世界的相似度 V…

項目工坊 | Python驅動淘寶信息爬蟲

目錄 前言 1 完整代碼 2 代碼解讀 2.1 導入模塊 2.2 定義 TaoBao 類 2.3 search_infor_price_from_web 方法 2.3.1 獲取下載路徑 2.3.2 設置瀏覽器選項 2.3.3 反爬蟲處理 2.3.4 啟動瀏覽器 2.3.5 修改瀏覽器屬性 2.3.6 設置下載行為 2.3.7 打開淘寶登錄頁面 2.3.…