c++红黑树,插入公式

概念


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

规则:
1. 每个结点不是红色就是黑色
2. 根节点是黑色的
3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点
5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)

 

插入

其实对于红黑树来说其实就是维护好一个规则,我们插入的时候每次除了第一个节点是插入节点是黑色,以后插入的新节点都是红色,插入完我们再判断是否需要去修改颜色,和旋转。修改颜色和旋转也是有公式的。

检测新节点插入后,红黑树的性质是否造到破坏
因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何
性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连
在一起的红色节点,此时需要对红黑树分情况来讨论:
约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点

情况一

每次当我们修改完颜色之后还需要向上循环去继续修改。
 

情况二

cur为红,p为红,g为黑,u不存在/u存在且为黑

情况三

其实就是需要双旋的情况

代码:
 

	bool insert(const K&key,const V&value){if (_node == nullptr){_node = new rbtreeNode(make_pair(key, value));_node->_col = BLACK;return true;}rbtreeNode* root = _node;rbtreeNode* rootp = _node;while (root){if (key < root->_kv.first){rootp = root;root = root->_left;}else if(key>root->_kv.first){rootp = root;root = root->_right;}else{break;}}rbtreeNode* newnode = new rbtreeNode(make_pair(key,value));if (key < rootp->_kv.first){rootp->_left = newnode;}else{rootp->_right = newnode;}newnode->_parent = rootp;newnode->_col = RED;rbtreeNode* cur = newnode;while (rootp&&rootp->_col==RED){rbtreeNode* grandfather = rootp->_parent;if (grandfather->_left == rootp)// u存在且为红 -》变色再继续往上处理{rbtreeNode* uncle = grandfather->_right;if (uncle && uncle->_col == RED){uncle->_col = rootp->_col = BLACK;grandfather->_col = RED;cur = rootp;rootp = rootp->_parent;if (rootp == _node)break;}else{if (rootp->_left == cur){//    g//  p   u//c//单旋rotateR(grandfather);rootp->_col = BLACK;grandfather->_col = RED;}else{//    g//  p   u//    c//双旋rotateL(rootp);rotateR(grandfather);grandfather->_col = RED;cur->_col = BLACK;}break;}}else{rbtreeNode* uncle = grandfather->_left;if (uncle && uncle->_col == RED){uncle->_col = rootp->_col = BLACK;grandfather->_col = RED;cur = rootp;rootp = rootp->_parent;if (rootp == _node)break;}else {if (rootp->_right == rootp){rotateL(grandfather);grandfather->_col = RED;rootp->_col = BLACK;}else{rotateR(rootp);rotateL(grandfather);grandfather->_col = RED;cur->_col = BLACK;}break;}}}_node->_col = BLACK;return true;}

红黑树的验证

这里我们也是去写一个函数去判断是否为红黑树。

bool isrbtree()
{return isrbtree(_node);    //将判断函数封装起来
}bool isrbtree(rbtreeNode*root)
{if (root == nullptr){return true;}int size = 0;rbtreeNode* head = root;while (head){if (head->_col == BLACK)size++;head = head->_left;       //找一个节点有多少个黑色节点,每条路径都有相同的黑色节点}if (_node->_col == RED){cout << "根为红" << endl;    //如果根节点吗为红色return falsereturn false;}return  iscout(root,0,size);}bool iscout(rbtreeNode*root,int count,int N)
{if (root == nullptr){if (count == N)			//判断每条路径的高是否相同。return true;else{cout << count << " " << N << endl;cout << "高不同" << endl;return false;}}if (root->_col==BLACK){count++;}rbtreeNode* rootp = root->_parent;if (rootp&&rootp->_col==RED&&root->_col==RED){cout << "有在一起的红节点" << endl;  //判断是否有连在一起的红节点return false;}return iscout(root->_left, count, N) && iscout(root->_right, count, N);
}

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

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

相关文章

C++ STL set_symmetric_difference

一&#xff1a;功能 给定两个集合A&#xff0c;B&#xff1b;求出两个集合的对称差&#xff08;只属于其中一个集合&#xff0c;而不属于另一个集合的元素&#xff09;&#xff0c;即去除那些同时在A&#xff0c;B中出现的元素。 二&#xff1a;用法 #include <vector>…

【前端手写代码】手写Object.create

思路&#xff1a;将传入的对象作为原型 // 思路&#xff1a;将传入的对象作为原型 function create(obj) {function F() { }F.prototype objreturn new F() }

Go 语言单例化利器 Once

Once 可以用来执行仅仅执行一次的动作,常常被应用于单个对象的初始化场景。 1. Once 的使用方法 sync.Once 只暴露了一个方法 Do,你可以多次调用 Do 方法,但是只有第一次调用 Do 方法时参数 f 才会执行,这里的 f 是一个无参数、无返回值的函数。 func (o *Once) do(f func…

学习java第一百四十二天

ApplicationContext通常的实现是什么&#xff1f; FileSystemXmlApplicationContext &#xff1a;此容器从一个XML文件中加载beans的定义&#xff0c;XML Bean配置文件的全路径名必须提供给它的构造函数 ApplicationContext context new FileSystemXmlApplicationContext(&quo…

Docker安装 OpenResty详细教程

OpenResty 是一个基于 Nginx 的高性能 Web 平台&#xff0c;它集成了 Lua 脚本语言&#xff0c;使得开发者可以在 Nginx 服务器上轻松地进行动态 Web 应用开发。OpenResty 的核心目标是通过将 Nginx 的高性能与 Lua 的灵活性结合起来&#xff0c;提供一个强大且高效的 Web 开发…

Redis备份策略面试三道题

关于Redis备份策略的面试题&#xff0c;由简单到困难&#xff0c;可以给出以下三道题目及其参考答案&#xff1a; 1. 简单题&#xff1a;Redis支持哪些主要的备份方式&#xff1f; 参考答案&#xff1a; Redis支持两种主要的备份方式&#xff1a; RDB&#xff08;Redis Data…

Hadoop3.3.5的安装与单机/伪分布式配置

文章目录 一、安装须知二、安装jdk三、安装shh四、安装配置hadoop五、运行hadoop 一、安装须知 本次安装的Hadoop版本为hadoop3.3.5。 在这之前完成了VMware虚拟软件的安装&#xff0c;并安装了Ubuntu22.04&#xff0c;在这基础上进行相关配置。 二、安装jdk 在Ubuntu中使用…

MongoDB - 组合聚合阶段:$group、$match、$limit、$sort、$skip、$project、$count

文章目录 1. $group2. $group-> $project2.1 $group2.2 $group-> $project2.3 SpringBoot 整合 MongoDB 3. $match-> $group -> $match3.1 $match3.2 $match-> $group3.3 $match-> $group-> $match3.4 SpringBoot 整合 MongoDB 4. $match-> $group->…

cesium海洋到站提示

项目地址:Every Admin: 用于快速搭建后台管理和其他页面的项目,组件化开发,以及大屏展示. <template> <div class"topbox"> xx海洋管理 </div> <div class"selectbox"> <div class"title"> 航线列表 </div>…

以乐观心态拥抱生活,坚信美好终会降临

在人生的漫漫长河中,我们每个人都如同漂泊在波涛汹涌的大海上的一叶扁舟,时而遭遇狂风骤雨,时而沐浴温暖阳光。生活中的种种际遇,或喜或忧,或顺或逆,如同变幻莫测的风云,常常让我们心生焦虑与不安。然而,我要在这里郑重地告诉您:凡事您不必担心,会有个好结局的。这并…

2024年暑假ACM集训第1场

A:小青蛙跳台阶 题目描述 想必你应该做过这么一道题&#xff1a;一只小青蛙一次可以跳1级台阶&#xff0c;也可以一次跳2级台阶。求该青蛙跳上第N级台阶总共有多少种跳法&#xff1f;&#xff08;假设小青蛙的初始位置是第0级台阶&#xff09; 现在小青蛙遇到了一点麻烦&#x…

Docker快速搭建WordPress博客系统网站

WordPress 是一款广泛使用的开源内容管理系统(CMS),用于创建和管理网站和博客。 主要功能: 易于使用的界面:WordPress 提供了一个直观的后台管理界面,使用户能够轻松创建、编辑和管理网站内容。 主题和模板:WordPress 提供了各种主题和模板,可根据网站需求进行选择和自…

MQ消息队列+Lua 脚本实现异步处理下单流程

具体实现和代码可参考我以前做过的笔记&#xff1a;《黑马点评》异步秒杀优化|消息队列 回顾一下下单流程&#xff1a; 用户发起请求 会先请求Nginx,Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行工作&#xff0c; 分为以下几个操作&#xff1…

前端(1)HTML

1、标签 创建1.html文件&#xff0c;浏览器输入E:/frontheima/1.html&#xff0c;可以访问页面 页面展示 在VSCODE安装IDEA的快捷键&#xff0c;比如ctld复制一行、ctrlx剪切 <p id"p1" title"标题1">Hello,world!</p> <p id"p2"…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…

网络安全新纪元:挑战、趋势与应对策略

引言 随着数字化时代的到来&#xff0c;网络安全不仅成为国家稳定发展的重要保障&#xff0c;也是国家安全的重要组成部分。近年来&#xff0c;网络安全领域面临着前所未有的挑战与机遇&#xff0c;一系列引人注目的趋势和预测逐渐浮出水面。本文将从网络安全的现状、面临的挑…

排序系列 之 希尔排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 英文名为ShellSort&#xff0c;又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本希尔排序是把记录按下标的指定步长分组&#xff0c;然后按照每组使用直接插入排序&#…

[C++] 模板编程-02 类模板

一 类模板 template <class T或者typename T> class 类名 { .......... } 1.1 两种不同的实现 在以下的两种实现中,其实第一种叫做成员函数模板&#xff0c;并不能称为类模板因为这种实现,我们在调用时,并不需要实例化为Product这个类指定指定特定类型。 // 实现1 clas…

C++程序的UI界面闪烁问题的解决办法总结

Windows C++程序复杂的UI界面要使用多种绘图技术(使用GDI、GDI+、ddraw、D3D等绘图),并要贴图去美化,在窗口移动或者改变大小的时候可能会出现闪烁。下面罗列一下UI界面产生闪烁的几种可能的原因,并给出相应的解决办法。 1、原因一 如果熟悉显卡原理的话,调用GDI函数向屏…

【动态规划】不同路径

不同路径&#xff08;难度&#xff1a;中等&#xff09; AC代码 有点水 class Solution { public:int uniquePaths(int m, int n) {//以m为行&#xff0c;n为列&#xff0c;创建二维数组vector <vector<int>> dp(m1,vector<int>(n1));dp[0][1]1;dp[1][0]1;…