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.mzph.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…