Java红黑树详解及示例

红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree),它确保了在最坏情况下基本操作(比如插入、删除、查找)都能在O(log n)时间内完成。红黑树的关键在于它在每个节点上存储了一个额外的位用于表示节点的颜色(红色或黑色),通过一组严格的规则来保证树的大致平衡。

1.红黑树的性质

红黑树有以下五个性质:

1. 每个节点不是红色就是黑色。
2. 根节点是黑色的。
3. 每个叶子节点(NIL节点)是黑色的。
4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

这些性质确保了红黑树的平衡性,从而使得基本操作的时间复杂度是O(log n)。

红黑树的插入操作

插入节点时,需要重新调整树以确保红黑树的性质不被破坏。插入操作的步骤如下:

1. 将新节点插入树中,并且将其颜色设为红色。
2. 如果插入后破坏了红黑树的性质,通过旋转和重新着色来恢复树的平衡。

2.代码示例

以下是一个用Java实现的红黑树的简单示例,包括插入操作:


public class RedBlackTree {private static final boolean RED = true;private static final boolean BLACK = false;private class Node {int key;Node left, right, parent;boolean color;Node(int key, boolean color, Node parent) {this.key = key;this.color = color;this.parent = parent;}}private Node root;public void insert(int key) {Node newNode = new Node(key, RED, null);if (root == null) {root = newNode;fixInsert(newNode);return;}Node current = root;Node parent = null;while (current != null) {parent = current;if (key < current.key) {current = current.left;} else if (key > current.key) {current = current.right;} else {return; // Duplicate keys are not allowed}}newNode.parent = parent;if (key < parent.key) {parent.left = newNode;} else {parent.right = newNode;}fixInsert(newNode);}private void fixInsert(Node node) {while (node != null && node != root && node.parent.color == RED) {if (node.parent == node.parent.parent.left) {Node uncle = node.parent.parent.right;if (uncle != null && uncle.color == RED) {node.parent.color = BLACK;uncle.color = BLACK;node.parent.parent.color = RED;node = node.parent.parent;} else {if (node == node.parent.right) {node = node.parent;rotateLeft(node);}node.parent.color = BLACK;node.parent.parent.color = RED;rotateRight(node.parent.parent);}} else {Node uncle = node.parent.parent.left;if (uncle != null && uncle.color == RED) {node.parent.color = BLACK;uncle.color = BLACK;node.parent.parent.color = RED;node = node.parent.parent;} else {if (node == node.parent.left) {node = node.parent;rotateRight(node);}node.parent.color = BLACK;node.parent.parent.color = RED;rotateLeft(node.parent.parent);}}}root.color = BLACK;}private void rotateLeft(Node node) {Node right = node.right;node.right = right.left;if (right.left != null) {right.left.parent = node;}right.parent = node.parent;if (node.parent == null) {root = right;} else if (node == node.parent.left) {node.parent.left = right;} else {node.parent.right = right;}right.left = node;node.parent = right;}private void rotateRight(Node node) {Node left = node.left;node.left = left.right;if (left.right != null) {left.right.parent = node;}left.parent = node.parent;if (node.parent == null) {root = left;} else if (node == node.parent.left) {node.parent.left = left;} else {node.parent.right = left;}left.right = node;node.parent = left;}public void inorder() {inorderHelper(root);}private void inorderHelper(Node node) {if (node != null) {inorderHelper(node.left);System.out.print(node.key + " ");inorderHelper(node.right);}}public static void main(String[] args) {RedBlackTree rbt = new RedBlackTree();int[] keys = {10, 20, 30, 15, 25, 5, 1};for (int key : keys) {rbt.insert(key);}rbt.inorder();}
}

在这段代码中,我们实现了一个简单的红黑树,包含节点类`Node`,红黑树类`RedBlackTree`以及插入和调整的函数。`rotateLeft`和`rotateRight`函数用于旋转子树以维持平衡。`fixInsert`函数用于插入新节点后进行调整以恢复红黑树的性质。

运行这段代码会在控制台打印插入节点后的中序遍历结果,从而验证红黑树的正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括&#xff1a; 领资料&#xff1a;点下方↓名片关注回复&#xff1a;粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理&#xff08;DPPM&#xff09; 前篇内容&#xff1a;①电池管理IC&#xff08;Charger&#xff09;了解一下&…

python中几种推导式简单样例

目录 一、python中几种推导式 1.1 列表推导式&#xff1a; 1.2 字典推导式 1.3 生成器表达式&#xff1a; 1.4 条件表达式&#xff1a; 二、简化对多个列表的并行迭代函数&#xff1a; 一、python中几种推导式 1.1 列表推导式&#xff1a; 使用列表推导式可以简化对列表…

基于java 自定义注解Annotation设计简单ORM框架——进阶篇

目录 引言实例新建两个注解标注实体类拼接sql语句 总结 引言 一般Java规范编程&#xff08;只是一种习惯&#xff0c;而不是强制&#xff09;中&#xff0c;变量的命名方式一般采用驼峰式命名。比如userName&#xff0c;userImage。但是在数据库中一般不会采用驼峰式&#xff…

AIGC、LLM 加持下的地图特征笔记内容生产系统架构设计

文章目录 背景构建自动化内容生产平台系统架构设计架构详细设计流程介绍笔记来源笔记抓取干预 笔记 AIGC 赋能笔记 Rule 改写笔记特征库构建 附录Bash Cron 定时任务Golang 与 Pyhon AIGC 实践 小结 背景 在大模型的浪潮下&#xff0c;ChatGPT、Sora、Gemini、文言一心 等新技…

js sleep 实现方式

在JavaScript中&#xff0c;由于其单线程和事件驱动的特性&#xff0c;没有直接的sleep函数&#xff0c;但你可以通过一些方法模拟出类似的效果。最常见的方式是使用setTimeout或者setInterval&#xff0c;以及更现代的Promise和async/await语法来实现异步等待。下面是几种实现…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏&#xff0c;先jadx分析一波 没有什么关键信息&#xff0c;但找到了一个unity类&#xff0c;想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息&#xff0c;看wp&#xff1a; Asse…

知识付费系统开源方案,教育机构如何利用朋友圈做转介绍?

招生成本高&#xff0c;效果差让许多教育机构头疼不已。对于教育机构来说通过转介绍招生是一个非常有效的途径&#xff0c;那么教育机构如何利用朋友圈做转介绍呢?今天小编就来和大家分享一下。 利用朋友圈做转介绍&#xff0c;主要是通过做活动&#xff0c;来完成增加粉丝、扩…

用面向对象的思想编写实时嵌入式C程序

实时嵌入式系统的软件一般由C语言编写&#xff0c;程序结构基本上都是这样的&#xff1a; // 主程序 int main(void) {init(); // 初始化while(1){tick(); // 业务逻辑}return 0; }// 计时器 static unsigned int g_timer_tick_cnt 0; // 时钟中断回调 void isr_time…

【工作篇】软件工程师的知识基础(持续更新)

目录 1. linux 知识篇 1. linux 知识篇 1. Linux API 是什么 Linux API 是指 Linux 操作系统 提供的应用程序接口&#xff0c;用于与操作系统进行交互。它包含了一系列的函数、系统调用、库函数和数据结构&#xff0c;用于实现各种系统级的操作&#xff0c;如文件操作、进程…

C++ 练习题四道 hv-LDM

1.判断两个日期间的天数 class test { public:int y, m, d, x;test(){y 2023, m 3, d 1, x 3;}test(int yy, int mm, int dd){y yy;m mm;d dd;}void ReturnWeekDay(){int iWeek 0;int Y 0, C 0, M 0, D 0;if (m 1 || m 2){C (y - 1) / 100;Y (y - 1) % 100;M …

HTML常用标签-布局相关标签

布局标签 div标签 俗称"块",主要用于划分页面结构,做页面布局 自己独占一行的元素&#xff0c;设置宽高生效 span标签 俗称"层",主要用于划分元素范围,配合CSS做页面元素样式的修饰 不会自己独占一行的元素&#xff0c;设置宽高不生效 代码 <div style&…

海南省薪鑫网络科技有限公司:引领智能剪辑纪元!

在数字化浪潮的激荡下&#xff0c;海南省薪鑫网络科技有限公司凭借其尖端技术实力&#xff0c;正引领着内容创作行业迈向一个崭新的智能剪辑纪元。这一划时代的变革&#xff0c;源于公司精心打造的AI剪辑软件&#xff0c;它不仅为剪辑工作赋予了新的高度&#xff0c;也为广大创…

段合并排序算法(附代码)

文章目录 前言一、题目二、代码总结 前言 学无止境&#xff0c;笔勤不辍。今天更新一道作业题好多人都被困住了&#xff0c;笔者也花了一些时间…后续会附上详细解释 使用的是python 一、题目 段合并排序算法&#xff1a; 将数组划分为n1/2个子数组&#xff0c;每个子数组有n…

高等代数复习:同构定理

文章目录 同构定理 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 同构定理 接下来我们要证明如下几个同构定理 定理&#xff08;线性映射同构定理&#xff09; 设 φ &#xff1a; V → V ′ \varphi&#xff1a;V\to V φ&#xff1a;V→V′ 是一个线性映射&…

RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏)

RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09; 文章目录 RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09;电路配置i2c1设备树创建驱动编写…

ScientificLinux/Centos/RedHat老版本离线安装gcc、g++记录

背景 最近有一台ScientificLinux6.3的机器需要使用gcc和g编译安装包&#xff0c; 因为在公司内网环境&#xff0c;而且软件仓库也停止维护&#xff0c;好在官方仓库中有老版本的归档目录&#xff0c; 在此记录下安装过程&#xff0c;centos和redhat也同样适用。 步骤 下载rp…

算法分析与设计复习__渐近+复杂度

算法v.s.程序: 程序 数据结构 算法&#xff1b; 1.时空复杂度T(n)/O(n)&#xff08;衡量一个算法的优劣&#xff09; 1.1最坏/最好/平均(所有输入等概出现)时间复杂度; 1.1.1 E.g.手算某算法&#xff08;冒泡排序&#xff09;程序段的T,O; 1.2算法的渐近表示&#xff1b; …

14030.ZynqMP配置vlan与ubuntu虚拟机(PC)进行通信

文章目录 1 场景描述2 zynqmp 开发板配置vlan2.1 配置内核2.2 配置vlan地址3 windows 配置网卡vlan标签3.1 网卡配置vlan标签3.2 开发板与windows进行ping连接4 ubuntu配置vlan4.1 ubuntu配置桥接,使用同样的物理网卡4.2 开发板ping 虚拟机5 VLAN的pcap与普通的pcap的区别1 场…

智慧安防系统:构建更安全的社区环境

随着科技的不断进步&#xff0c;人们的生活质量得到了显著提高。然而&#xff0c;与此同时&#xff0c;社会治安问题也日益凸显。为了维护社会的和谐稳定&#xff0c;提高人们的生活安全感&#xff0c;智慧安防系统应运而生。本文将为您详细介绍智慧安防系统的项目背景、需求分…

3D,点云平面拟合

文章目录 一、RANSAC平面拟合1、原理2、伪代码二、最小二乘平面拟合1、原理2、伪代码参考资料三维空间中,平面方程的一般表达式为: A x + B y + C z + D =