红黑树的插入 C++

红黑树与二叉搜索树类似

它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍)。它同时满足以下特性:

1.节点是红色或黑色
2.根是黑色
3.叶子节点(外部节点,空节点)都是黑色,这里的叶子节点指的是最底层的空节点(外部节点),下图中的那些null节点才是叶子节点,null节点的父节点在红黑树里不将其看作叶子节点
红色节点的子节点都是黑色
4.红色节点的父节点都是黑色
5.从根节点到叶子节点的所有路径上不能有 2 个连续的红色节点
6.从任一节点到叶子节点的所有路径都包含相同数目的黑色节点

现在我们进行对红黑数的插入

enum Colour
{BLACK,RED,
};
template<class K, class V>
class RBTreeNode
{RBTreeNode<K, V>* _left;RBTreeNode<K, V>* _right;RBTreeNode<K, V>* _parent;pair<K, V>_kv;Colour _col;
};template<class K, class V>
class RBtree
{typedef RBTreeNode<K, V>Node; public:bool Insert(const pair<K, V>& kv){//1.按搜索树的规则进行插入if (!_root){_root = new Node(kv);return true;}Node* parent = nullptr;Node* cur = _root;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);if (parent->_kv.first < kv.first){parent->_right=cur;cur->_parent = parernt;}else{parent->left = cur;cur->_parent=parent;}//新增节点红的cur->_col = RED;while (parent->_col == RED){//红黑树的调节关键看父节点的另一个节点Node* grandfather = parent->_parent;if (grandfather->_left == parent){Node* uncle = grandfather->_right;//情况一:uncle存在且为红if (uncle && uncle->_col == RED){parent->_col = uncle->_col = BLACK;grandfather->_col = RED;//继续往上处理cur = grandfather;parent = cur->_parent;}//情况二:uncle不存在或为黑else{//情况三:双旋—>单旋if (cur==parent->_right){RotateL(parent);//左旋swap(parent, cur);}RotateR(grandfather);grandfather->_col = RED;parent->_col = BLACK;break;}}else{Node* uncle = grandfather->_right;//情况一:uncle存在且为红if (uncle && uncle->_col == RED){parent->_col = uncle->_col = BLACK;grandfather->_col = RED;//继续往上处理cur = grandfather;parent = cur->_parent;}//情况二:uncle不存在或为黑else{//情况三:双旋—>单旋if (cur == parent->_right){RotateR(parent);swap(parent, cur);}RotateL(grandfather);grandfather->_col = RED;parent->_col = BLACK;break;}}}root->_col = BLACK;return true;}private:Node* _root = nullptr;
};

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出Stream流

Java 8的新特性之一就是流stream&#xff0c;配合同版本出现的 Lambda &#xff0c;使得操作集合&#xff08;Collection&#xff09;提供了极大的便利。 案例引入 在JAVA中&#xff0c;涉及到对数组、Collection等集合类中的元素进行操作的时候&#xff0c;通常会通过循环的…

学习bat脚本

内容包含一些简单命令或小游戏&#xff0c;在乐趣中学习知识。 使用方法&#xff1a; 新建文本文档&#xff0c;将任选其一代码保存到文档中并保存为ASCII编码。将文件后缀改为.bat或.cmd双击运行即可。 一. 关机脚本 1. 直接关机 echo off shutdown -s -t 00秒直接关机。 2…

亿图图示下载安装教程EdrawMax Pro 13版超详细图文教程

亿图图示下载安装教程EdrawMax Pro 13版超详细图文教程&#xff1a; 亿图图示是一款功能强大的综合绘图软件&#xff0c;具有以下特点和功能 丰富的绘图类型&#xff1a;涵盖 210 余种办公绘图类型&#xff0c;包括流程图、思维导图、信息图、工业设计、组织架构图、平面设计…

Java学习第五天(续)

方法 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以方便重复调用。 主要分析返回值和形参&#xff0c;只要确定这两个就可以定义方法。 方法调用内存图 方法调用完之后就从栈内存清除走了&#xff1b; 方法参数传递机制&#xff1a; 值传递&a…

UE4_地形_悬崖拉伸的解决

参考教程 【虚幻5】UE5_UE4_解决悬崖地形贴图拉伸_哔哩哔哩_bilibili 纹理处理 | 虚幻引擎 4.27 文档 | Epic Developer Community (epicgames.com) 主要通过蓝图节点解决&#xff1a;WorldAlignedTexture WorldAlignedTexture&#xff08;全局一致纹理&#xff09;函数用于…

spark sql 优化

1. 配置 比例内存 : core 1:2 2. 增加 core 数可以增加 执行任务的 线程数 3. 计算有大表&#xff0c;并发生shuffle 时&#xff0c;生成的任务数是由spark.sql.shuffle.partitions 决定的&#xff0c;所以针对大表shuffle &#xff0c;要增加spark.sql.shuffle.partitio…

台球助教陪练预约系统源码开发

随着科技的发展和人们对生活质量要求的提高&#xff0c;体育运动的数字化趋势日益明显。台球作为一种集休闲娱乐与竞技于一体的运动项目&#xff0c;在全球范围内拥有广泛的爱好者群体。为了更好地满足这部分人群的需求&#xff0c;开发一个高效的台球助教陪练预约系统变得尤为…

被低估的SQL

SQL是现代数据库管理系统中不可或缺的一部分。尽管它的使用已十分普遍&#xff0c;但在数据处理领域&#xff0c;SQL的某些功能和潜力仍然被许多人低估。接下来&#xff0c;小编将与您一起&#xff0c;探讨SQL的一些被忽视的特性&#xff0c;揭示它在数据管理中的真正实力。 1.…

【ssh】如何远程连接

1. 在C:\Users\.ssh的config文件里输入配置&#xff0c;如&#xff1a; 如图使用了跳板机 2. 打开cmd&#xff0c;输入&#xff1a; ssh 主机名 出现报错&#xff1a;WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! SSH 检测到该主机的密钥与之前保存的密钥不匹配。解决&…

C++ | Leetcode C++题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; class Solution { public:int lengthLongestPath(string input) {int n input.size();int pos 0;int ans 0;vector<int> level(n 1);while (pos < n) {/* 检测当前文件的深度 */int depth 1;while (pos < n && in…

新的打包工具 Rsbuild 尝鲜:Vue2-cli 项目迁移 Rsbuild

当前时间 2024-08-31 看到一个新的打包工具&#xff0c;于是想试一试&#xff0c;这里是官网 测试 用过 vue-cli 的同志们应该有所感受&#xff0c;启动项目挺慢的&#xff0c;我这个项目不太大&#xff0c;第一次启动是最慢的&#xff0c;之后启动快了一些些&#xff0c;而且…

echarts组件——条形统计图

echarts组件——条形统计图 竖向条形统计图&#xff0c;单柱状&#xff0c;多柱状&#xff0c;悬浮框展示 组件代码 <template><div :class"classname" :style"{height:height,width:width}" /> </template><script> // 柱状图…

鸿蒙(API 12 Beta6版)图形【NativeDisplaySoloist开发指导】方舟2D图形服务

如果开发者想在独立线程中进行帧率控制的Native侧业务&#xff0c;可以通过DisplaySoloist来实现&#xff0c;如游戏、自绘制UI框架对接等场景。 开发者可以选择多个DisplaySoloist实例共享一个线程&#xff0c;也可以选择每个DisplaySoloist实例独占一个线程。 接口说明 函…

c++ 156函数

inline内联函数 #include<iostream> using namespace std;inline void printA() {int a 10;cout << "a:" << a << endl;}void main() {//printA();//c编译器会这样 把函数体机械地放到main函数里面{int a 10;cout << "a:"…

如何构建Java SpringBoot中药材管理系统,实现高效进存销,2025届必备技能!

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Windows安装docker,启动ollama运行open-webui使用AIGC大模型写周杰伦歌词

Windows安装docker&#xff0c;启动ollama运行open-webui使用AIGC大模型写周杰伦歌词 1、下载docker的Windows版本。 docker下载地址&#xff1a; https://docs.docker.com/desktop/install/windows-install/https://docs.docker.com/desktop/install/windows-install/ 2、设…

ui 自动化测试过程是什么?

UI自动化测试是指通过模拟用户操作来测试应用程序的用户界面的一种测试方法。它可以模拟用户在应用程序上的操作&#xff0c;比如点击按钮、输入文本等&#xff0c;然后检查应用程序的响应是否符合预期。UI自动化测试可以提高测试效率并减少人工测试的工作量&#xff0c;同时可…

电脑永久删除的文件还能找回来吗?别再担心,误删文件也能救回!

在日常使用电脑的过程中&#xff0c;我们有时会因为各种原因而永久删除一些文件。这些文件可能是重要的工作文档、珍贵的照片&#xff0c;或者是其他对我们来说有价值的资料。一旦这些文件被永久删除&#xff0c;我们往往会感到焦虑和担忧&#xff0c;不知道是否还能够找回这些…

Linux核心技能:主流监控Prometheus详解,附官方可复制中文文档教程

Prometheus既是一个时序数据库&#xff0c;又是一个监控系统&#xff0c;更是一套完备的监控生态解决方案。作为时序数据库&#xff0c;目前Prometheus已超越了老牌的时序数据库OpenTSDB、Graphite、RRDtool、KairosDB等&#xff0c;如图所示。 &#xff08;来源网络&#xff0…

CAN-FD是怎么提高通信速率的?

经典CAN协议规定的最高速率是1Mb/s,汽车中实际应用的最高速率是500Kb/s&#xff0c;这个速度对于绝大部分ECU之间的数据通信已经足够了&#xff0c;而且CAN的技术成熟、稳定、成本低&#xff0c;因此CAN通信在汽车行业中得到了长期的应用。 随着汽车智能化的发展&#xff0c;汽…