红黑树学习

              

红黑树:

 k v 方式

用在哪里:

1.hash

 强查找的过程:

 1.rbtree

 2.hash

 3.b/b+ tree

 4.链表

 红黑树:

 1.每个结点是红的或者是黑的

 2.根结点是黑的

 3.每个叶子结点是黑的

 4.如果一个结点是红的,则它的两个儿子是黑的

 5.对每个节点,从该节点到其子孙结点的所有路径上的包含路径上的黑结点相同

红黑树在插入任何一个结点之前,就是一颗红黑树

左旋:

右旋:

插入:

1.先找到合适的位置

2.先插入节点默认为红色,后面再进行调整

插入调整:

// 定义键类型的别名
typedef int KEY_TYPE;// 定义红色和黑色的宏
#define RED 0
#define BLACK 1// 定义红黑树节点结构的宏
#define RBTREE_ENTRY(name, type) \struct name                  \{                            \struct type *left;       \struct type *right;      \\struct type *parent;     \\unsigned char color;     \}// 定义红黑树节点结构
typedef struct _rbtree_node
{KEY_TYPE key; // 节点键值void *value;  // 节点关联的值#if 1struct rbtree_node *left;   // 左子节点指针struct rbtree_node *right;  // 右子节点指针struct rbtree_node *parent; // 父节点指针unsigned char color;        // 节点颜色
#elseRBTREE_ENTRY(, rbtree_node) // 使用宏定义节点结构node;
#endif} rbtree_node;// 定义红黑树结构
typedef struct _rbtree
{rbtree_node *root; // 根节点指针rbtree_node *nil;  // 默认黑色空节点
} rbtree;// 左旋操作
void rbtree_left_rotate(rbtree *tree, rbtree_node *x)
{// x的右子节点rbtree_node *y = x->right;// 1. 把y的左子节点变成x的右子节点x->right = y->left;if (y->left != tree->nil)y->left->parent = x;// 2. 把x变成y的左子节点y->parent = x->parent;if (x->parent == tree->nil)tree->root = y;else if (x == x->parent->left)x->parent->left = y;elsex->parent->right = y;// 3. 把x变成y的左子节点y->left = x;x->parent = y;
}// 右旋操作
void rbtree_right_rotate(rbtree *tree, rbtree_node *x)
{// x的左子节点rbtree_node *y = x->left;// 1. 把x的左子节点变成y的右子节点y->left = x->right;if (x->right != tree->nil)x->right->parent = y;// 2. 把y变成x的右子节点x->parent = y->parent;if (y->parent == tree->nil)tree->root = x;else if (y == y->parent->left)y->parent->left = x;elsey->parent->right = x;// 3. 把y变成x的左子节点x->right = y;y->parent = x;
}// 插入后修复红黑树性质
void rbtree_insert_fixup(rbtree *tree, rbtree_node *z)
{// 当z的父节点为红色时,需要修复红黑树性质while (z->parent->color == RED){// 判断父节点是祖父节点的左子节点还是右子节点if (z->parent == z->parent->parent->left){// 叔父节点rbtree_node *y = z->parent->right;if (y->color == RED){// 情况1:父节点和叔父节点都是红色z->parent->color = BLACK;y->color = BLACK;z->parent->parent->color = RED;// 继续对祖父节点进行修复z = z->parent->parent;}else{// 情况2:父节点是红色,叔父节点是黑色if (z == z->parent->right){z = z->parent;rbtree_right_rotate(tree, z);}// 情况3:父节点是红色,叔父节点是黑色if (z == z->parent->left){z->parent->color = BLACK;z->parent->parent->color = RED;rbtree_right_rotate(tree, z->parent->parent);}}}else{// 对称处理右子树的情况}}
}// 插入节点到红黑树
void rbtree_insert(rbtree *t, rbtree_node *z)
{// 寻找插入位置rbtree_node *x = t->root;rbtree_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;}}// 将z插入到y的适当位置if (y->key >= z->key){y->left = z;}else{y->right = z;}z->parent = y;z->left = t->nil;z->right = t->nil;z->color = RED;// 插入后修复红黑树性质rbtree_insert_fixup(t, z);
}

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

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

相关文章

性能学习5:性能测试的流程

一.需求分析 二.性能测试计划 1&#xff09;测什么&#xff1f; - 项目背景 - 测试目的 - 测试范围 - ... 2&#xff09;谁来测试 - 时间进度与分工 - 交付清单 - ... 3&#xff09;怎么测 - 测试策略 - ... 三.性能测试用例 四.性能测试执行 五.性能分析和调优 六…

ElasticSearch备考 -- Search across cluster

一、题目 配置两个集群&#xff0c;集群名称为my-application-01、my-application-02&#xff0c;导入es自带Sample flight data数据集&#xff0c;配置扩集群检索&#xff0c;查询数据 二、思考 准备工作有两个集群&#xff0c;并需要对集群配置角色中增加 remote_cluster_cl…

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…

光伏组件模型模板在SketchUp中如何完成成模数化设计?

选中模板组件&#xff0c;点击左侧工具栏中移动工具&#xff0c;按住Ctrl再依次点击组件起始点和终点&#xff0c;完成组件复制&#xff0c;输入需要复制的组件数量&#xff08;*n&#xff09;后回车&#xff0c;即可完成模数化设计。 选中模组的多块模型右键进行创建组件或群…

高考技术——pandas使用

百家讲坛&#xff0c;谈论古今&#xff0c;今天我们不聊别的&#xff0c;我们来聊一聊中国的国宝——大熊猫&#xff08;bushi&#xff09; 好好&#xff0c;言归正传&#xff0c;我们今天来讲pandas import pandas as pd 申明无需多言&#xff0c;高考主要考察Series和Data…

【Docker】docker的存储

介绍 docker存储主要是涉及到3个方面&#xff1a; 第一个是容器启动时需要的镜像 镜像文件都是基于图层存储驱动来实现的&#xff0c;镜像图层都是只读层&#xff0c; 第二个是&#xff1a; 容器读写层&#xff0c; 容器启动后&#xff0c;docker会基于容器镜像的读层&…

多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。

自己写的多文件 MD5校验工具&#xff0c;一个文件开一个线程&#xff0c;有最大I/O 缓存设置&#xff0c;兼容读写MD5后缀文件。 共计91个文件&#xff0c;合计180G左右 12分钟左右&#xff0c;UI基本卡废&#xff0c;但程序没蹦&#xff0c;属于正常。 卡的原因是基本是用 I/O…

WSL2Linux 子系统(十二)

wsl 子系统安装 cuda 环境 《WSL2Linux 子系统(十一)》讲述 WSL 网络转为桥接模式的两种方法&#xff0c;WSL 网络桥接模式无论是静态 IP 还是动态分配 IP 均支持。本篇文章则是简单讲述 WSL 安装 cuda 环境。 作者&#xff1a;炭烤毛蛋 &#xff0c;点击博主了解更多。 提示…

RabbitMQ的各类工作模式介绍

简单模式 P: ⽣产者, 也就是要发送消息的程序 C: 消费者,消息的接收者 Queue: 消息队列, 图中⻩⾊背景部分. 类似⼀个邮箱, 可以缓存消息; ⽣产者向其中投递消息, 消费者从其中取出消息.特点: ⼀个⽣产者P&#xff0c;⼀个消费者C, 消息只能被消费⼀次. 也称为点对点(Point-to-…

从零开始构建大型语言模型——实现注意力机制

本章内容&#xff1a; 使用注意力机制的原因基本的自注意力框架&#xff0c;逐步深入到增强的自注意力机制允许LLMs逐个生成词元的因果注意力模块通过dropout随机屏蔽部分注意力权重以减少过拟合将多个因果注意力模块堆叠为多头注意力模块 到目前为止&#xff0c;你已经了解了…

参数标准+-db和-db

-db是因为比值是相近的&#xff0c;值越进行越好&#xff0c;正负db代表两个值差异不大&#xff0c;可以分子比分母大或者分母比分子大-db代表串扰&#xff0c;分子比分母小&#xff0c;所以负db的值越小越好

【预备理论知识——2】深度学习:线性代数概述

简单地说&#xff0c;机器学习就是做出预测。 线性代数 线性代数是数学的一个分支&#xff0c;主要研究向量空间、线性方程组、矩阵理论、线性变换、特征值和特征向量、内积空间等概念。它是现代数学的基础之一&#xff0c;并且在物理学、工程学、计算机科学、经济学等领域有着…

港股大跌敲响警钟

10月3日&#xff0c;港股早间突如其来的下跌一度登上热搜榜&#xff0c;而午后回暖的恒指则一度抹去跌幅持平。截至当日收盘&#xff0c;恒指跌1.47%&#xff0c;报22&#xff0c;113.51点&#xff0c;守住了22000点关口&#xff1b;恒生科技指数跌、跌3.46%&#xff0c;报4978…

使用微服务Spring Cloud集成Kafka实现异步通信

在微服务架构中&#xff0c;使用Spring Cloud集成Apache Kafka来实现异步通信是一种常见且高效的做法。Kafka作为一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据&#xff0c;非常适合用于微服务之间的消息传递。 微服务之间的通信方式包括同步通信和异步通信。 1&a…

深度学习之开发环境(CUDA、Conda、Pytorch)准备(4)

目录 1.CUDA 介绍 1.1 CUDA 的基本概念 1.2 CUDA 的工作原理 1.3 CUDA 的应用领域 2. 安装CUDA 2.1 查看GPU版本 2.2 升级驱动&#xff08;可选&#xff09; 2.3 查看CUDA版本驱动对应的支持的CUDA ToolKit工具包 2.4 下载Toolkit 2.5 安装&#xff08;省略&#xff0…

均值模板和二阶差分模板的频率响应

均值模板和二阶差分模板都是偶对称。实偶函数的傅里叶变换仍是实偶函数。 给个证明过程 实偶函数 一个函数 f ( x ) f(x) f(x) 被称为实偶函数&#xff0c;如果它满足以下条件&#xff1a; f ( − x ) f ( x ) f(-x) f(x) f(−x)f(x) 傅里叶变换 对于一个实偶函数 f (…

用Python实现运筹学——Day 13: 线性规划的高级应用

一、学习内容 1. 多目标线性规划 多目标线性规划&#xff08;MOLP&#xff09;是线性规划的扩展形式&#xff0c;涉及多个相互冲突的目标函数。这类问题在实际应用中非常普遍&#xff0c;例如在供应链管理中&#xff0c;可能需要同时优化成本、时间、质量等多个目标。由于多个…

python如何比较字符串

Python可使用cmp()方法来比较两个对象&#xff0c;相等返回 0 &#xff0c;前大于后&#xff0c;返回 1&#xff0c;小于返回 -1。 a "abc" b "abc" c "aba" d "abd" print cmp(a,b) print cmp(a,c) print cmp(a,d) //返回 0 1 …

速览!2024 CSP-J1/S1 河北也被实名举报泄题

据NOI官网消息&#xff0c;继2024 CSP-J/S第一轮认证陕西鸿泉培训机构泄题之后&#xff0c;重考&#xff01;CSP-J/S 2024第一轮认证泄题后续进展及疑问&#xff0c;河北某学校也被学生实名举报泄题&#xff0c;河北某同学在认证前一天以非正当手段获得了认证题目且属实&#x…

(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)

目录 前言 修改方向 修改内容 效果展示 两个新的问题&#x1f64b; 1.问题1 2.问题2 代码如下&#xff1a; 前言 我们上一节实现了贪吃蛇吃食物身体节点变长&#xff0c;但是食物的刷新位置不是随机的&#xff0c;并且初始化几次后食物就刷不见了&#xff0c;本节我们就来…