红黑树(思维导图详解版)
目录
资源已上传
实现代码
测试代码
资源已上传
部分图片

实现代码
注意判断是否为红黑树的代码实现,实现代码中红黑树的删除
#pragma once
#include<iostream>
using namespace std;enum Color_Type
{Red,Black
};template<class K,class V>
struct RBTreeNode
{pair<K, V> _kv;RBTreeNode* _parent;RBTreeNode* _left;RBTreeNode* _right;Color_Type _color;RBTreeNode(const pair<K, V> kv): _kv(kv), _parent(nullptr), _left(nullptr), _right(nullptr), _color(Red){}};template<class K, class V>
class RBTree
{typedef RBTreeNode<K, V> Node;
private:Node* _root;
public:RBTree():_root(nullptr){}bool Insert(const pair<K, V>& kv){if (_root == nullptr){_root = new Node(kv);_root->_color = Black;return true;}Node* cur = _root;//指向当前节点的位置Node* parent = nullptr;//当前节点的父节点//找到插入位置while (cur){if (cur->_kv.first < kv.first) {parent = cur;cur = cur->_right;}else if (cur->_kv.first > kv.first) {parent = cur;cur = cur->_left;}else {return false;}}cur = new Node(kv);cur->_color = Red;if (cur->_kv.first < parent->_kv.first) {parent->_left = cur;cur->_parent = parent;}else{parent->_right = cur;cur->_parent = parent;}//父节点为红色,插入后还需做调整while (parent && parent->_color == Red){Node* grandfather = parent->_parent;if (parent == grandfather->_left){Node* uncle = grandfather->_right;if (uncle && uncle->_color == Red){// 变色parent->_color = uncle->_color = Black;grandfather->_color = Red;// 继续向上处理cur = grandfather;parent = cur->_parent;}else//uncle不存在或uncle为黑{if (cur == parent->_left){// g// p//crotateR(grandfather);parent->_color = Black;grandfather->_color = Red;}else{// g//p // crotateL(parent);rotateR(grandfather);cur->_color = Black;grandfather->_color = Red;}break;}}else{Node* uncle = grandfather->_left;// u存在且为红if (uncle && uncle->_color == Red){// 变色parent->_color = uncle->_color = Black;grandfather->_color = Red;// 继续向上处理cur = grandfather;parent = cur->_parent;}else{if (cur == parent->_right){// g// p// crotateL(grandfather);grandfather->_color = Red;parent->_color = Black;}else{// g// p// crotateR(parent);rotateL(grandfather);cur->_color = Black;grandfather->_color = Red;}break;}}}_root->_color = Black;return true;}bool IsBalance(){return _IsBalance(_root);}int Height(){return _Height(_root);}bool checkColor(Node* root, int blacknum, int basenum){if (root == nullptr){if (blacknum != basenum){return false;}return true;}if (root->_color == Black){++blacknum;}if (root->_parent && root->_parent->_color == Red && root->_color == Red){cout << root->_kv.first << "出现连续红色节点" << endl;return false;}return checkColor(root->_left, blacknum, basenum) && checkColor(root->_right, blacknum, basenum);}
private:void rotateL(Node* parent){Node* subR = parent->_right;Node* subRL = subR->_left;Node* pparent = parent->_parent;//1.建立subRL与parent之间的关系//左子树滑动parent->_right = subRL;if (subRL) {subRL->_parent = parent;}//2.建立subR和parent之间的关系//更新右子树的左子树subR->_left = parent;parent->_parent = subR;//3.建立pparent和subR之间的关系//与上一个节点建立连接if (parent == _root){_root = subR;subR->_parent == nullptr;}else{subR->_parent = pparent;if (parent = pparent->_left) {pparent->_left = subR;}else {pparent->_right = subR;}}}void rotateR(Node* parent){Node* subL = parent->_left;Node* subLR = subL->_right;Node* pparent = parent->_parent;//滑动parent->_left = subLR;if (subLR) {subLR->_parent = parent;}//更新左子树的右子树subL->_right = parent;parent->_parent = subL;if (parent == _root) {_root = subL;subL->_parent = nullptr;}else {subL->_parent == pparent;if (parent = pparent->_left) {pparent->_left = subL;}else {pparent->_right = subL;}}}int _Height(Node* root){if (!root) {return 0;}int left = _Height(root->_left);int right = _Height(root->_right);return left > right ? left + 1 : right + 1;}bool _IsBalance(Node* root){if (root == nullptr){return true;}if (root->_color != Black){return false;}int basenum = 0;Node* cur = _root;while (cur){if (cur->_color == Black) {++basenum;}cur = cur->_left;}return checkColor(root, 0, basenum);}};
测试代码
#include "RB_tree.h"
#include<vector>int main()
{const int N = 10;vector<int> v;v.reserve(N);srand(time(0));for (size_t i = 0; i < N; i++){v.push_back(i);}for (auto i : v){cout << i << " ";}cout << endl;RBTree<int, int> rbt;for (auto e : v){rbt.Insert(make_pair(e, e));cout << "Insert:" << e << endl;}cout << rbt.Height() << endl;if (rbt.IsBalance()){cout << "ok" << endl;}return 0;
}
相关文章:
红黑树(思维导图详解版)
目录 资源已上传 实现代码 测试代码 资源已上传 部分图片 实现代码 注意判断是否为红黑树的代码实现,实现代码中红黑树的删除 #pragma once #include<iostream> using namespace std;enum Color_Type {Red,Black };template<class K,class V> str…...
javafx学习记录
1.布局 2.选择重写或实现方法(select methods to override/implements) ctrl o 3.javafx有init方法,start方法,stop方法 4.定义一个按钮,使用系统默认浏览器访问网站 5.使窗口的关闭栏,缩小扩屏栏,代码是倒数第二行 6.设置模态窗口,默认关闭模态的 下…...
友善Nona Pi开发板ubuntu22.04系统用Python3.8.17的pip安装PyQt5.15.2时报错“Q_PID”这个宏未定义的一种解决办法
安装命令: pip install PyQt55.15.2 --config-settings --confirm-license --verbose -i https://mirrors.aliyun.com/pypi/simple/ 遇到出错: 如图: 分析具体错误内容: These bindings will be built: Qt, QtCore, QtNetwo…...
HTML中name和class,id的区别和联系
在HTML中,name、class和id是用于标识和选择元素的属性。 区别: name属性:用于标识表单元素,特别是在提交表单时,用于识别表单数据。name属性可以在同一表单中的多个元素中重复使用。class属性:用于为一个…...
Google 开源库Guava详解(集合工具类)—Maps、Multisets、Multimaps
一、Maps Maps有许多很酷的实用程序,值得单独解释。 1、uniqueIndex Maps.uniqueIndex(Iterable,Function)解决了一个常见的情况,即有一堆对象,每个对象都有一些唯一的属性,并希望能够根据该…...
肖sir__mysql之介绍__001
mysql之介绍 一、认识数据库 (1)什么是数据库? 是存放数据的电子仓库。以某种方式存储百万条,上亿条数据,供多个用户访问共享。 如: (2)数据库分关系型数据库和非关系型数据库 a、…...
【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙
文章目录 前言一、代价地图自定义图层1.1 Costmap组成1.2 costmap_2d1.3 实现过程1.3.1 安装插件1.3.2 在costmap_2d中插入障碍物1.3.3 修改launch文件1.3.4 设置障碍物坐标参数二、图像编辑器2.1 安装GIMP2.1.1 命令行方式安装2.1.2 使用图形界面安装GIMP:2.2 实现过程三、ro…...
每日一题~中序后序遍历构造二叉树
原题链接:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) 题目描述: 思路分析: 后序遍历分析图 中序遍历分析图 不难看出后序遍历的结果中的最后一个元素就是根节点,倒数第二个元素则是根节点的…...
Sentinel整合Gateway
pom引入依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>…...
线性dp,优化,272. 最长公共上升子序列
272. 最长公共上升子序列 - AcWing题库 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。 小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究最长公共上升子序列了。 小沐沐说,对于两个数列 A 和 B&…...
基于Java+SpringBoot+Vue+uniapp点餐小程序(包含协同过滤算法和会员系统,强烈推荐!)
校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…...
ActiveMQ面试题(二)
文章目录 前言一、死信队列二、ActiveMQ 中的消息重发时间间隔和重发次数吗?总结 前言 死信队列ActiveMQ 中的消息重发时间间隔和重发次数吗? 一、死信队列 如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重试…...
解决Oracle SQL语句性能问题——SQL语句改写(in、not in、exists及not exists)
8. in改为join in为Oracle数据库支持的条件语法,该语法会使得代码看起来思路清晰,逻辑分明。该语法有时也会导致SQL语句产生次优的执行计划,而导致SQL语句的性能问题。因此,为了解决相关SQL语句的性能问题,有时我们需要通过join来改写和消除in,具体改写方法如下所示。 …...
列表对象复制属性到另一个列表对象 从List<Object>另一个List<Object>
目录 事件起因环境和工具解决办法结束语 事件起因 在写一个市级的项目时,遇到了一个问题,这个项目涉及的数据内容非常大,光是数据库文件的大小就已经达到了12G,数据的规模大致是在百万级的,光是我这次参与处理的数据就…...
Python基本情况
Python(发音:/ˈpaɪθən/ )是一种强大的编程语言,它简单易学,提供众多高级的数据结构,让我们可以面向对象进行编程。Python 的语法优雅,由于是一个解释性语言,更贴近人类自然语言&…...
【精华】AI Agent:大模型改变世界的“钥匙”
文章目录 1.Auto-GPT2.BabyAGI3.AgentGPT4.GodMode5.AI Town6.ChatDev 当前大模型的本质是大语言模型(Large Language Model, LLM)。相较于传统的自然语言处理模型,LLM通过无监督训练,从大量文本数据中学习自然语言的模式和结构&a…...
CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构
编辑 | Happy 首发 | AIWalker 链接 | https://mp.weixin.qq.com/s/l3US8Dsd0yNC19o7B1ZBgw project, paper, code Token Mixer是ViT骨干非常重要的组成成分,它用于对不同空域位置信息进行自适应聚合,但常规的自注意力往往存在高计算复杂度与高延迟问题。…...
瑞萨MCU入门教程(非常详细的瑞萨单片机入门教程)
瑞萨MCU零基础入门系列教程 前言 得益于瑞萨强大的MCU、强大的软件开发工具(e studio),也得益于瑞萨和RA生态工作室提供的支持,我们团队编写了《ARM嵌入式系统中面向对象的模块编程方法》,全书37章,将近500页: 讲解面向对象编程…...
【Java】采用 Tabula 技术对 PDF 文件内表格进行数据提取
某天项目组来了个需求说需要提取 PDF 文件中数据作为数据沉淀使用,这是因为第三方系统不提供数据接口所以只能够出此下策。 就据我所知,PDF 文件内数据提取目前有 3 种解决方案: 第一种,资金足够的话可以直接通过人工智能对 PDF…...
完全保密的以太坊交易:Aztec网络的隐私架构
1. 引言 Aztec为隐私优先的以太坊zkRollup:即其为具有完全隐私保护的L2。 为了理解私有交易的范式变化性质,以及为什么将隐私直接构建到网络架构中很重要,必须首先讨论为什么以太坊不是私有的。 2. 以太坊:公有链 以太坊为具有…...
Photoshop AVIF插件实战:解锁下一代图像格式的完整解决方案
Photoshop AVIF插件实战:解锁下一代图像格式的完整解决方案 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 为Adobe Photoshop添加AVIF格式支持不再…...
Spratt Skills:基于LLM规划与代码执行的OpenClaw家庭自动化架构实践
1. 项目概述:Spratt Skills,一个为OpenClaw打造的家庭自动化基础设施套件 如果你正在使用OpenClaw,并且已经厌倦了让LLM(大语言模型)去处理那些它天生就不擅长的事情——比如定时发送消息、轮询航班状态、或者可靠地写…...
2026届学术党必备的六大降重复率平台推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 令AI精确执行任务的基础,是下达精准的指令,此即降AI指令。降AI指令专…...
【Nature期刊精准捕获术】:基于Perplexity语义图谱的跨学科文献溯源方法论(附2024最新验证数据集)
更多请点击: https://intelliparadigm.com 第一章:【Nature期刊精准捕获术】:基于Perplexity语义图谱的跨学科文献溯源方法论(附2024最新验证数据集) 传统关键词检索在跨学科高影响力期刊(如 Nature、Scie…...
教培机构管理越忙越乱?用对工具,比多雇两个人更高效
不少培训机构校长都有同样的感受:明明团队很拼,每天从早忙到晚,可机构依旧问题不断。招生线索散落在微信、表格、登记本里,跟进不及时就白白流失;排课全靠人工核对,老师冲突、教室撞期、调课通知不到位是常…...
终极大脑训练指南:5个简单步骤用BrainWorkshop提升你的认知能力
终极大脑训练指南:5个简单步骤用BrainWorkshop提升你的认知能力 【免费下载链接】brainworkshop Continued development of the popular brainworkshop game 项目地址: https://gitcode.com/gh_mirrors/br/brainworkshop BrainWorkshop是一款专业的免费开源大…...
国家级数据仓库构建:从爬取到应用的全流程实践指南
1. 项目概述与核心价值最近在整理一个数据项目时,我偶然发现了一个名为“national_data”的仓库,作者是Ddhjx。这个项目名听起来平平无奇,但点进去之后,我发现它远不止是一个简单的数据集合。它本质上是一个结构化的、持续更新的国…...
数据分析进阶——【连载 5/9】《Power BI数据分析与可视化案例教程》项目5 数据建模
Power BI 数据建模教程|推介总结 适应人群:数据分析师、业务分析人员、财务 / 运营 / 销售岗、高校学生、企业内训学员、Power BI 进阶学习者。 重要性总结:本文档是 Power BI 数据建模核心实操教程,系统讲解数据建模全流程&#…...
大模型风口已至:月薪30K+的AI Agent开发岗,你准备好了吗?
文章介绍了如何借助不同版本的Agents实现智能自动化,并详细描述了AI应用工程师和大模型算法工程师的岗位职责和任职要求。文章还强调了AI学习的重要性,指出最先掌握AI的人将具有竞争优势,并提供了大模型AI学习和面试资料,帮助读者…...
可穿戴设备十年演进:从技术突破到健康与生产力工具
1. 从预言到现实:可穿戴计算浪潮的十年回望与深度拆解十年前,当EE Times那篇关于Apple iWatch和Google Glasses将引领可穿戴计算浪潮的文章发表时,业界还弥漫着一种将信将疑的氛围。彼时,智能手机正处巅峰,人们很难想象…...
