当前位置: 首页 > news >正文

红黑树的插入 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 = parent;}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;
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • tomcat架构设计分析,核心组件详解
  • 【C++】容器list常用接口详解
  • idea新建父工程和添加导入新模块的步骤
  • 关于STM32运行时卡住问题
  • Adobe DC 2022提示无法识别的错误 - 解决方案
  • C4 单细胞测序中,oligo文库 和 cDNA 文库 各自的功能和区别
  • 【Kubernetes知识点问答题】Service 发现
  • TPM在解决哪些类型的问题时最有效?
  • log4j 清除MDC上下文 MDC分类日志
  • Python Tkinter小程序
  • 10,sql约束(2)
  • RedisStack十部曲之二:Redis的核心概念
  • python读取excel数据详细解说
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • 2408wtl,解析快捷方式
  • Consul Config 使用Git做版本控制的实现
  • CSS魔法堂:Absolute Positioning就这个样
  • JS笔记四:作用域、变量(函数)提升
  • Linux中的硬链接与软链接
  • Mysql5.6主从复制
  • ng6--错误信息小结(持续更新)
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • unity如何实现一个固定宽度的orthagraphic相机
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 动态规划入门(以爬楼梯为例)
  • 聚类分析——Kmeans
  • 理清楚Vue的结构
  • 使用agvtool更改app version/build
  • 使用putty远程连接linux
  • 延迟脚本的方式
  • 一份游戏开发学习路线
  • 因为阿里,他们成了“杭漂”
  • 用jquery写贪吃蛇
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #控制台大学课堂点名问题_课堂随机点名
  • (55)MOS管专题--->(10)MOS管的封装
  • (70min)字节暑假实习二面(已挂)
  • (C++17) std算法之执行策略 execution
  • (HAL库版)freeRTOS移植STMF103
  • (Java入门)学生管理系统
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (三)模仿学习-Action数据的模仿
  • (十二)Flink Table API
  • (转)EOS中账户、钱包和密钥的关系
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)用.Net的File控件上传文件的解决方案
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 漏洞分析 | 某ERP系统存在SQL注入