JAVA:紅黑樹應用的技術指南

🌳 1、簡述

紅黑樹是一種自平衡二叉查找樹(Self-Balancing Binary Search Tree),被廣泛應用于操作系統調度、Java集合、數據庫索引等核心模塊中。本文將從 基本原理 入手,結合 實際應用場景與代碼實例,帶你全面理解紅黑樹的精髓。

代碼樣例:https://gitee.com/lhdxhl/algorithm-example.git

在這里插入圖片描述


📘 2、什么是紅黑樹?

紅黑樹是一種特殊的二叉查找樹(BST),其核心目的是通過維護“顏色約束”來實現平衡,從而提高插入、查找和刪除操作的效率。

紅黑樹的每個節點除了值和左右指針外,還會包含一個顏色字段()。

🎯 紅黑樹的五大性質

  1. 每個節點不是紅色就是黑色。
  2. 根節點是黑色。
  3. 所有葉子節點(NIL)都是黑色的(虛擬葉子節點)。
  4. 若一個節點是紅色,則其子節點必須是黑色(紅色節點不能相鄰)。
  5. 從任一節點到其葉子節點的所有路徑上,黑色節點數量相同

? 這些性質共同確保了樹的“近似平衡”,從而使紅黑樹操作的時間復雜度保持在:

  • 查找:O(log n)
  • 插入:O(log n)
  • 刪除:O(log n)

在這里插入圖片描述


🔧 3、紅黑樹的操作(核心邏輯)

📥 插入操作流程

  • 插入節點為紅色,作為 BST 插入。
  • 若父節點為黑色,插入完成。
  • 若父節點為紅色,需通過旋轉(左旋/右旋)+變色保持平衡。
  • 最終保持根節點為黑色。

📤 刪除操作流程

刪除較復雜,需要考慮:

  • 替代節點顏色是否影響黑平衡;
  • 是否需要旋轉或變色修復結構;
  • 若刪除的是黑節點,需額外修復。

🧪 3、實踐樣例

用 Java 手寫簡化版紅黑樹:

public class RedBlackTree<K extends Comparable<K>, V> {private static final boolean RED = true;private static final boolean BLACK = false;private class Node {K key;V value;Node left, right;boolean color;Node(K key, V value, boolean color) {this.key = key;this.value = value;this.color = color;}}private Node root;// 判斷節點是否為紅色private boolean isRed(Node node) {return node != null && node.color == RED;}// 左旋private Node rotateLeft(Node h) {Node x = h.right;h.right = x.left;x.left = h;x.color = h.color;h.color = RED;return x;}// 右旋private Node rotateRight(Node h) {Node x = h.left;h.left = x.right;x.right = h;x.color = h.color;h.color = RED;return x;}// 顏色翻轉private void flipColors(Node h) {h.color = RED;h.left.color = BLACK;h.right.color = BLACK;}// 插入public void put(K key, V value) {root = put(root, key, value);root.color = BLACK;}private Node put(Node h, K key, V value) {if (h == null) return new Node(key, value, RED);int cmp = key.compareTo(h.key);if (cmp < 0) h.left = put(h.left, key, value);else if (cmp > 0) h.right = put(h.right, key, value);else h.value = value;if (isRed(h.right) && !isRed(h.left)) h = rotateLeft(h);if (isRed(h.left) && isRed(h.left.left)) h = rotateRight(h);if (isRed(h.left) && isRed(h.right)) flipColors(h);return h;}public V get(K key) {Node x = root;while (x != null) {int cmp = key.compareTo(x.key);if (cmp < 0) x = x.left;else if (cmp > 0) x = x.right;else return x.value;}return null;}
}

下面是基于上面實現的 RedBlackTree 類的使用樣例,幫助你理解紅黑樹在 Java 中的基本操作與實際應用場景:

public class RedBlackTreeExample {public static void main(String[] args) {RedBlackTree<Integer, String> tree = new RedBlackTree<>();// 插入元素tree.put(10, "十");tree.put(5, "五");tree.put(15, "十五");tree.put(1, "一");tree.put(7, "七");// 查詢元素System.out.println("key=7 -> " + tree.get(7)); // 輸出: 七System.out.println("key=10 -> " + tree.get(10)); // 輸出: 十System.out.println("key=20 -> " + tree.get(20)); // 輸出: null(不存在)}
}

💡 4、應用場景

應用場景使用說明
🔠 Java 的 TreeMap / TreeSet使用紅黑樹實現有序鍵值對集合
🧠 Linux CFS(完全公平調度器)使用紅黑樹調度任務時間片
🗂 數據庫索引(如 PostgreSQL)作為內存結構實現 B-Tree 之前的數據排序
🧬 內核內存管理設備地址映射、區域管理等

🔍 紅黑樹 vs 其它平衡樹對比

數據結構插入復雜度是否自平衡應用代表
AVL樹O(log n)少見、用于內存索引
紅黑樹O(log n)是(弱平衡)TreeMap、Linux
B+ 樹O(log n)數據庫索引
跳表(SkipList)O(log n)是(概率)Redis

🧭 5、總結

紅黑樹的最大優點就是在保持結構平衡的同時,又能保證高效的增刪查性能,是大規模數據結構的核心基石。

? 學完你可以掌握:

  • 紅黑樹的原理與五大性質
  • 插入操作過程中的旋轉與變色
  • 實際代碼實現簡化版紅黑樹
  • 常見業務中紅黑樹的落地應用

📂 附:可選擴展方向

  • 實現紅黑樹刪除操作
  • 結合 java.util.TreeMap 調試源碼
  • 使用紅黑樹管理區間(如IP段、時間段)

如果你對紅黑樹的圖解可視化、動畫講解或 C++ 實現也感興趣,我可以為你定制進一步內容!

是否需要將該博客生成 PDF、Markdown 或部署在 Hugo/Hexo 博客模板中?我可以幫你一鍵生成。

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

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

相關文章

【Pandas】pandas DataFrame rfloordiv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于執行 DataFrame 與另一個對象&#xff08;如 DataFrame、Series 或標量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于執行 DataFrame 與另一個對象&…

【數據可視化-26】基于人口統計與社會經濟數據的多維度可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

WinForm真入門(18)——DateTimePicker?控件解析

一、基本概念? ?DateTimePicker? 是 Windows 窗體中用于選擇日期和時間的控件&#xff0c;支持以下交互方式&#xff1a; 通過下拉日歷選擇日期通過上下按鈕調整時間直接輸入日期或時間 適用于需要規范日期格式、限制日期范圍或快速輸入的場景&#xff08;如預約系統、數據…

AVFormatContext 再分析

說明 &#xff1a;將 avfromatContext 的變量依次打印分析&#xff0c;根據ffmpeg 給的說明&#xff0c;猜測&#xff0c;結合網上的文章字節寫測試代碼分析。 從常用到不常用依次分析 1. unsigned int nb_streams; 代表 avfromatContext 中 AVStream **streams 的個數 /** …

計算機網絡-運輸層(1)

計算機網絡-運輸層(1) 文章目錄 計算機網絡-運輸層(1)5.1 運輸層概述5.2 運輸層端口號、復用與分用端口號基本概念端口號特性端口號分類重要說明 5.3 UDP與TCP協議對比關鍵區別說明 5.1 運輸層概述 計算機網絡體系結構中的物理層、數據鏈路層以及網絡層共同解決了主機通過異構…

2025 FIC wp

這次比賽計算機和手機大部分題目都比較常規 第一和第四部分有點讓人摸不著頭腦 比賽的時候第一部分有四個題沒出 第四部分基本都沒怎么出 現在復盤一下 把我當時做題的心得和獲取的新知識記錄一下 互聯網取證的部分就先學習一下別的師傅 檢材 鏈接&#xff1a;https://pan.bai…

【大數據技術-聯邦集群RBF】DFSRouter日志一直打印修改Membership為EXPIRED狀態的日志分析

生產環境遇到下面報錯 2025-04-23 17:44:15,780 INFO store.CachedRecordStore (CachedRecordStore.java:overrideExpiredRecords(192)) - Override State Store record MembershipState: router1:8888->hh-fed-sub25:nn2:nn2:8020-EXPIRED 2025-04-23 17:44:15,781 INFO …

【HarmonyOS 5】鴻蒙檢測系統完整性

【HarmonyOS 5】鴻蒙檢測系統完整性 一、前言 從現實安全威脅來看&#xff0c;設備系統完整性風險已影響至移動應用的各個場景。不少用戶因使用越獄設備&#xff08;Jailbreak&#xff09;或非真實設備&#xff08;Emulator&#xff09;&#xff0c;導致應用安全防護機制失效…

學習spark-streaming收獲

1.流處理的核心概念 ?實時 vs微批處理&#xff1a;理解了 Spark Streaming 的微批處理&#xff08;Micro-Batch&#xff09;模型&#xff0c;將流數據切分為小批次&#xff08;如1秒間隔&#xff09;進行處理&#xff0c;與真正的流處理&#xff08;如Flink&#xff09;的區…

Redis一些小記錄

Redis一些小記錄 SpringData Redis&#xff1a;RedisTemplate配置與數據操作 操作String類型數據 String是Redis中最基本的數據類型&#xff0c;可以存儲字符串、整數或浮點數。RedisTemplate提供了ValueOperations接口來操作String類型的數據&#xff0c;支持設置值、獲取值、…

5G融合消息PaaS項目深度解析 - Java架構師面試實戰

5G融合消息PaaS項目深度解析 - Java架構師面試實戰 場景&#xff1a;互聯網大廠Java求職者面試&#xff0c;面試官針對5G融合消息PaaS項目進行提問。 第一輪提問 面試官&#xff1a;馬架構&#xff0c;請簡要介紹5G融合消息PaaS平臺的核心功能和應用場景。 馬架構&#xff…

【C語言極簡自學筆記】C 語言數組詳解:一維數組與二維數組

在 C 語言中&#xff0c;數組是一種非常重要的數據結構&#xff0c;它可以將多個相同類型的元素組織在一起&#xff0c;以便于我們進行批量處理和操作。本文將詳細介紹 C 語言中的一維數組和二維數組&#xff0c;包括它們的定義、初始化、元素訪問以及內存存儲等方面的內容。 …

04.通過OpenAPI-Swagger規范讓Dify玩轉Agent

dify安裝 cd dify cd docker cp .env.example .env docker compose up -d準備自定義工具 我自建的PowerDNS&#xff0c;它的swagger如下&#xff1a; https://github.com/PowerDNS/pdns/blob/master/docs/http-api/swagger/authoritative-api-swagger.yaml 但需要加上&#x…

汽車產業鏈主表及類別表設計

&#xff08;提前設計&#xff0c;備用&#xff09; 一、汽車產業鏈類別表&#xff08;industry_chain_category&#xff09; 設計要點 1、核心字段&#xff1a;定義產業鏈分類&#xff08;如零部件、整車制造、銷售服務等&#xff09; 2、主鍵約束&#xff1a;自增ID作為唯一標…

?RISC-V架構的低功耗MCU多電壓域優化設計

RISC-V核低功耗MCU的多電壓域設計是一種優化電源管理以降低功耗的技術方案。該設計通過電源域劃分、電壓轉換和時序管理等手段&#xff0c;有效降低了系統功耗并提升能效&#xff0c;適用于物聯網和嵌入式系統等場景。 多電壓域設計的基本原理是將芯片劃分為多個獨立供電區域&…

基于STM32、HAL庫的AD7616BSTZ模數轉換器ADC驅動程序設計

一、簡介: AD7616BSTZ是Analog Devices公司生產的一款16位、雙通道、同步采樣SAR型ADC芯片,主要特點包括: 16位分辨率 雙通道同步采樣 最高采樣率:1MSPS/通道 輸入范圍:10V, 5V或2.5V(軟件可編程) 串行(SPI)和并行接口選項 低功耗:典型值100mW 工作溫度范圍:-40C至+8…

CUDA Stream 回調函數示例代碼

文章目錄 CUDA Stream 回調函數示例代碼基本概念示例代碼代碼解釋回調函數的特點更復雜的示例&#xff1a;多個回調注意事項 CUDA Stream 回調函數中使用 MPI 或 NCCL示例程序注意事項 CUDA Stream 回調函數示例代碼 CUDA 中的流回調函數(stream callback)是一種在 CUDA 流中插…

全棧黑暗物質:可觀測性之外的非確定性調試

一、量子計算的測不準Bug 1. 經典 vs. 量子系統的錯誤模式 量子程序崩潰的觀測影響&#xff1a; 調試方法崩潰復現率觀測干擾度日志打印12%35%斷點調試5%78%無侵入跟蹤27%9%量子態層析成像63%2% 二、量子調試工具箱 1. 非破壞性觀測協議 # 量子程序的無干擾快照 from qiski…

ASP.NET8.0入門與實戰

1、項目初始化 創建一個ASP.NET Core Web API的項目&#xff0c;取消Https和身份驗證。 API項目實際上是一個控制臺程序&#xff0c;這點可以在項目的屬性的輸出類型中看到。 launchSettings.json&#xff0c;在這里可以配置運行項目的名稱&#xff0c;端口號&#xff0c;路…

Synopsys 邏輯綜合的整體架構概覽

目錄 一、DC Shell 邏輯綜合的整體架構概覽 ?? 邏輯綜合的主要階段&#xff08;Pipeline&#xff09; 二、核心架構模塊詳解 1. Internal Database&#xff08;設計對象數據庫&#xff09; 2. Scheduler&#xff08;調度器&#xff09; 3. Rewriting Engine&#xff08…