【数据结构】红黑树定义及基本操作

手撕红黑树——C++高阶数据结构详解 带你一命通关红黑树 十五分钟手撕数据结构原理 阅读详情

红黑树基础定义

  1. 二叉搜索树,每个节点要么是黑节点,要么是红节点
  2. 每个节点到下面叶子节点的所有路径中,黑色节点的数量都相等
  3. 红色节点的子节点一定是黑色节点
  4. 根节点是黑色节点
  5. 叶子节点全是黑色节点。

其C语言的结构体定义如下

typedef struct _rbtree_node {
	int key;
	void *val;
	
	struct _rbtree_node *parent;
	struct _rbtree_node *left;
	struct _rbtree_node *right;
	char color;
} rbtree_node;

typedef struct _rbtree {
	struct _rbtree_node *root;
	struct _rbtree_node *nil;  // 需要生成一个通用的黑色叶子节点,代表空,避免复杂的边界null处理
} rbtree;

红黑树插入新节点

红黑树左旋和右旋

红黑树的插入操作,需要定义左旋和右旋的操作。
左旋右旋
从上图可以看出,左旋和右旋是可逆的操作,且不会改变节点的颜色。

  • 左旋代码(只有核心操作代码)
void rbtree_left_rotation(rbtree *T, rbtree_node *x)
{
	
	rbtree_node *y = x->right;
	// 先把b节点放到x的右节点上
	x->right = y->left;
	if (y->left != T->nil) {
		y->left->parent = x;
	}
	
	// 再把y节点接到x的父节点上
	if (x->parent == T->nil) { // 此时x为根节点,所以parent是空
		T->root = y;
	} else if (x->parent-left == x) {
		x->parent->left = y;
	} else {
		x->parent->right = y;
	}
	y->parent = x->parent;

	// 再把x放到y的左节点上
	x->parent = y;
	y->left = x;
	
}
  • 右旋代码(把左旋代码中的x和y对调, left和right对调即可)
void rbtree_right_rotation(rbtree *T, rbtree_node *y)
{
	rbtree_node *x = y->left;
	// 先把b节点放到y的左节点上
	y->left = x->right;
	if (x->right != T->nil) {
		x->right->parent = y;
	}
	
	// 再把x节点接到y的父节点上
	if (y->parent == T->nil) { // 此时x为根节点,所以parent是空
		T->root = x;
	} else if (y->parent-right == x) {
		y->parent->right = x;
	} else {
		y->parent->left = x;
	}
	x->parent = y->parent;

	// 再把y放到x的右节点上
	y->parent = x;
	x->right = y;
	
}
  • 插入代码
void rbtree_insert_fixup(rbtree *T, rbtree_node *z)
{
	while (z->parent->color == RED) {
		if (z->parent == z->parent->parent->left) {
			rbtree_node *y = z->parent->parent->right;
			if (y->color == RED) {
				z->parent->color = BLACK;
				y->color = BLACK;
				z->parent->parent->color = RED;
				z = z->parent->parent;
			} else {
				if (z == z->parent->right) {
					z = z->parent;
					rbtree_left_rotation(T, z);
				}
				
				z->parent->color = BLACK;
				z->parent->parent->color= RED;
				rbtree_right_rotation(T, z->parent);
				
			}
		}
		
	}

}

void rbtree_insert(rbtree *T, rbtree_node *z)
{
	rbtree_node *x = T->root;
	btree_node *y = T->nil;
	while (x != T->nil) {
		y = x;
		if (z->key < x->key) {
			x = x->left;
		} else if (z->key > x->key) {
			x = x->right;
		} else {
			return;
		}
	}

	if (y == T->nil) {
		T->root = z;
		return;
	}

	if (z->key > y->key) {
		y->right = z;
	} else {
		y->left = z;
	}
	z->parent = y;

	z->color = RED;
	rbtree_insert_fixup(T, z);
}

B树、B+树、红黑树的定义、之间的区别、优缺点、数据结构、应用等 B树是一种自平衡的多路搜索树,它可以有多个子节点,不同于二叉树的是,一个节点可以有超过两个的子节点。B树特别适合用于读写相对较大的数据块的存储系统,如磁盘。B+树是B树的变种,所有的值都在叶子节点上并且叶子节点是通过指针连接的这样就提供了对数据的顺序访问。内部节点(非叶子节点)只存储键值,并作为索引使用。红黑树是一种自平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。 阅读详情

相关推荐

【数据结构】红黑树

红黑树的概念、红黑树的性质、红黑树结点的定义、红黑树的增删查改、红黑树的验证、红黑树与AVL树的比较

2301_80277275的博客 1173

红黑树JAVA代码实现

//手写红黑树 package com.nko.tree; /** * 1.创建RBTree,定义颜色 * 2.创建RBNode * 3.辅助方法定义:parentOf(node),isRed(node),setRed(node),setBlack(node),inOrderPrint() * 4.左旋方法定义:leftRotate(node) * 5.右旋方法定义:rightRota...

搁浅沉默的博客 817

数据结构 - 红黑树

数据结构 - 红黑树 - 面试常问知识点 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组、链表)、栈与队列、树(二叉树、二叉查找树、平衡二叉树、红黑树)、图。 本文主要介绍树中的常见的红黑树数据结构。包括 简介 应用 左旋和右旋 简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的

从零开始 3411

红黑树c++实现

红黑树的实现文件(RBTree.h) /** * C++ 语言: 红黑树 * * @author skywang * @date 2013/11/07 */ #ifndef _RED_BLACK_TREE_HPP_ #define _RED_BLACK_TREE_HPP_ #include <iomanip> #include <iostream> using namespace std; enum RBTColor{RED, BLACK}; template

积累点滴,保持自我 405

三、分区配置

rk3566/rk3568 修改分区

暮云星影的博客 514

MT5交易软件系统源码

Manager配置的功能及权限:管理客户、开户,销户、入金、信用额度、修改定单、人工交易报表、设定点差、强制平仓、修改密码,设定持仓交割单或挂单小止盈止损点数;26、修改价格 27、更改K线图历史价格 28、同步历史数据;2、系统设置 3、交易管理 4、交易柜台 5、价格更改 6、多台服。务器联机 7、恢复交易历史 8、数据源调整 9、备份服务调整 10、交易市场设定 11、交易单更改 12、平台时间设定(全世界) 13、可添加商品;15、设置商品利息;独立主机(服务器、VPS、VM)

tutujunjun的博客 904

C语言实现红黑树

C代码实现红黑树

nothing 624

从JX-2R-01热敏打印机芯到稳定打印:硬件设计与时序控制的实践指南

本文详细解析了JX-2R-01热敏打印机芯的硬件设计与驱动开发全流程。核心内容包括:实现严格的双电源上电时序控制、采用PWM恒流驱动步进电机确保走纸平稳,以及精确控制SPI数据加载与加热脉冲时序以获得清晰打印效果。文章提供了从电路设计、芯片选型到代码调试的实战指南,旨在帮助开发者构建稳定可靠的热敏打印模块。

weixin_29169899的博客 220

数据结构--树--红黑树

R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 红黑树的特性:(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](...

weixin_30628801的博客 178

FPGA+CUYSB3014实现USB3.0功能

CYUSB3014是赛普拉斯在近几年推出的新一代USB3.0的外设控制器,可以解决USB2.0带宽限制,或者单独开发USB协议和驱动的难题。赛普拉斯将CYUSB3014简称为EZ-USB FX3,具有高度的灵活特性,开发人员只需要下载FX3的固件库,就能使用USB3.0的功能。目前在一些电子产品中,使用主控器加PHY芯片最流行的方式是用FPGA+FX3这种搭配来实现USB3.0接口。......

D_Katter的博客 7065

【VibeCoding系列】小白入门指南:模型选择、编辑器选择、项目预定全分析

开箱即用:下载安装就能用,不用配 API Key(也可以自己配)Cmd+K 快速修改:选中代码,按 Cmd+K,直接让 AI 修改Cmd+L 对话:侧边栏聊天,支持引用文件和代码@文件引用:输入 @ 就能引用项目中的文件,AI 自动读取上下文Agent 模式:告诉 AI 一个需求,它自动跨文件修改下载地址cursor.com(免费版有额度限制,足够入门)✅下载 Cursorcursor.com),安装打开✅选一个小项目(个人名片页 or Todo List)✅按照七步工作流开干。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 210

利用Go实现红黑树数据结构及其优势

在Go语言编程中,红黑树以其独特的特性和高效的操作,为解决复杂的数据管理问题提供了强大的工具。从基本特性的理解到具体操作的实现,再到与其他数据结构的对比分析,深入掌握红黑树,将有助于开发者在面对各种数据处理场景时,做出更优的选择。3. 内存效率:相比于一些平衡二叉树(如AVL树),红黑树的旋转操作相对较少,在频繁的插入和删除操作中,能减少内存的频繁分配和释放,提高内存使用效率。4. 如果一个节点是红色的,则它的两个子节点都是黑色的(即不存在两个连续的红色节点)。Go语言实现红黑树的节点定义。

wire290的博客 463

Cadence 批量一次性修改title 页码标题

本文介绍如何在Cadence软件中对DSN文件进行标题栏的批量编辑操作,包括选择编辑对象、使用快捷键打开属性面板以及如何修改标题、页码等关键信息。

tianpu2320959696的博客 975

学习->C++篇十五:红黑树和map,set

目录 一 . 红黑树的定义(规则): 二 . 红黑树是如何保持平衡的? 插入操作: 情况一:叔叔节点存在且为红色 情况二:叔叔节点不存在或存在且为黑色 三.map和set如何封装?

u014801954的博客 1030

【Bug已解决】Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows la

原始报错:Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows laptops场景:用户在 Windows 笔记本上登录应用成功了,但随后每个业务请求都返回 401,提示"Missing bearer/basic authentication"。登录态像是"假的"——明明登了,请求却没带任何认证信息。多台 Windows 设备都能复现。

一键难忘的博客 593

【参数配置】OpenClaw 的破解之道(Doom Loop)

本文深入解析了OpenClaw中的Doom Loop(死循环)问题及其应对策略。主要内容包括: Agent Loop的核心概念:基于ReAct范式,OpenClaw通过"思考-行动-观察"循环执行任务,但可能陷入无进展的死循环。 Doom Loop现象:Agent持续执行但任务进度为零,常见于四种工具调用场景:相同调用重复执行、调用不存在工具、轮询工具卡死、操作交替振荡。 OpenClaw的防御机制: 第一道防线:重试端断路器,通过上下文压缩熔断(最多3次)和总重试次数熔断(32-160次)防止无限重试。

海兰 4042

C++之红黑树(二)

转载自:http://www.cnblogs.com/skywang12345/p/3245399.html 红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 除了具备该特性之外,红黑树还包括许多额外

YF_Li123的博客 465

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python 红黑树_红黑树的Python实现

1 #!/usr/bin/env python2 #coding: gbk34 ########################################################################5 #Author: Feng Ruohang6 #Create: 2014/10/06 11:387 #Digest: Provide a common data struc...

weixin_39959236的博客 142

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法基础之--红黑树实现

package wck.sort;/** * Created on 18/9/13. */ /** * @program: demo * @description: 红黑树实现 * @author: wck * @create: 2018-09-13 11:07 **/ public class RBT &lt;K extends Comparable&lt;K&gt;, V&gt...

奔波儿灞 265

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

021-红黑树(二)

1、红黑树节点定义。一个节点对象一共包含5个属性,这5个属性是构造红黑树的核心。 2、红黑树的节点左旋。 如上图,该图是对节点x进行一次左旋操作的示意图。一共涉及6个节点,其中每个节点需要考虑左右孩子节点和父节点这三个属性。可以容易地发现:lx节点和ry节点的三个属性维持不变。下面分析改变了属性的4个节点(Px,x,y,ly)。 1)对于节点Px而言。分3种情况讨论:如果...

weixin_30655219的博客 90

利用红黑树自己编写 C++ MAP

搞定红黑树,就想着写来玩玩。于是,就配合C++的模板技术写了一个简单的Map。 看了一些博客,个人感觉还是Wiki上讲红黑树讲的清晰一些,我承认没完全看懂算法导论上删除结点的树调整,连他的二叉树删除节点都看晕我了,还不如直接写来的快。下面是我总结了一下插入结点和删除结点的树...

chuanyang6282的博客 266

红黑树封装

迭代器分为两种,普通和const类型,所以它们的返回参数不能一样,为了它们俩可以调用同一个函数,将类模板的参数设置为3个,其中Ref代表const T&,Ptr代表const T*一个是不可修改即二叉搜索树的性质,一个是返回值不可修改即二叉树查找的性质。begin()返回的迭代器类型是const类型,但是红黑树里面的begin返回的是普通类型,所以要拷贝构造,进行类型转换。set的key不允许修改,所以set的迭代器和const迭代器的底层都是红黑树的const迭代器。2.模板参数第一个为K代表参数类型。

whcwhc111111的博客 325

内核红黑树源码注解

内核红黑树源码注解 1 typedef struct st_rb_node { 2 /** 3 * 本结构体四字节对齐,因而其地址中低位两个bit永远是0。 4 * Linux内核开发人员非常爱惜内存,他们用其中一个空闲的位来存储颜色信息。 5 * parent_color成员实际上包含了父节点指针和自己的颜色信息。

奔跑的路 716

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树...

在上一篇数据结构的博文《数据结构(三):非线性逻辑结构-二叉树》中已经对二叉树的概念、遍历等基本的概念和操作进行了介绍。本篇博文主要介绍几个特殊的二叉树,堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树,它们在解决实际问题中有着非常重要的应用。本文主要从概念和一些基本操作上进行分类和...

weixin_30456039的博客 180

数据结构——红黑树

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的

未知陨落的博客 2140

数据结构之红黑树

红黑树的概念、性质、插入、验证; AVL树和红黑树的比较

我要学编程的博客 2012
上一篇: 【QT-QML】8. 输入元素
下一篇: [数据结构]B树的基本定义和操作
SilentSlot
博客等级 码龄16年 44粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值