红黑树(RBTree)认识总结

一、认识红黑树

1.1 什么是红黑树?

红黑树是一种二叉搜索树,与普通搜索树不同的是,在每个节点上增加一个“颜色”变量 —— RED / BLACK 。

通过对各个节点颜色的限制,确保从 根 到 NIL ,没有一条路径会比其他路径长出两倍。

NIL :表示叶子节点的空指针,统一设置为 BLACK

1.2 红黑树的性质
  • 根节点一定是黑色
  • 不能出现两个连续的红色节点
  • 对于同一高度而言,从根到该高度任一节点的简单路径上的黑色节点的数量相同
1.3 红黑树节点定义

二、红黑树

2.1 红黑树定义
template<class K, class V>
class RBTree
{typedef RBTreeNode<K, V> Node;private:Node* _root;
};
2.2 插入

红黑树的插入是我们学习红黑树过程最重要的知识之一,它主要分为两部分:平衡二叉树的插入 和 旋转 —— 调整树形结构。

插入部分与普通搜索树没有本质区别,这里不做过多介绍。

声明一下:代码中的 grandfather 和 图中的 grandparent 为同一东西,笔者在基本结束本篇时发现这里差异。

  • 插入部分
bool Insert(const pair<K, V> kv)
{if (_root == nullptr){_root = new Node(kv);_root->_col = BLACK; // 根一定为黑色节点return true;}Node* cur = _root;Node* parent = nullptr;while (cur){if (cur->_kv.first > kv.first){parent = cur;cur = cur->_left;}else if (cur->_kv.first < kv.first){parent = cur;cur = cur->_right;}else {return false; // 树中已经存在要插入的值,本次插入失败}}cur = new Node(kv);if (cur == parent->_left){parent->_left = cur;}else {parent->_right = cur;}cur->_parent = parent;_root->_col = BLACK; // 强制设定根一定为黑色!return true;
}
  • 旋转
2.2.1 什么时候要旋转?

我们新插入的节点默认是红色,当它的 parent 存在且为红色时,就出现了这种情况 —— 树存在两个连续的红色节点,此时我们需要对该部分子树进行旋转 —— 调整树的结构。(下图只展示了部分的子树)

判断条件:parent 存在且为红色

	while (parent && parent->_col == RED){ }
2.2.2 几种旋转情况
情形一:uncle 存在,且为红色节点

在这里插入图片描述

	Node* grandfather = parent->_parent;if (parent == grandfather->_left){Node* uncle = grandfather->_right;if (uncle && uncle->_col == RED) // 叔叔存在且为红色{grandfather->_col = RED;parent->_col = BLACK;uncle->_col = BLACK;cur = grandfather; //  向上调整parent = cur->_parent;}}if (parent == grandfather->_right){Node* uncle = grandfather->_left;// ... // 与上面代码一致}
情形二:uncle 不存在 或 存在且为黑色
  • parent 在 grandfather 左侧的两种情况
	if (parent == grandfather->_left) // parent 在 grandfather 左侧的两种情况{if (!uncle || uncle->_col == BLACK){if (cur == parent->_left) // cur 在 parent 左侧{RotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else // cur 在 parent 右侧{RotateL(parent);RotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}break; // 旋转结束后,一定要 break }}

旋转结束后,树的结构已经满足了红黑树的标准,如果不跳出循环、继续调整,会出现各种奇怪的问题。

  • parent 在 grandfather 右侧
	if (parent == grandfather->_right) // parent 在 grandfather 右侧{if (!uncle || uncle->_col == BLACK) // uncle 不存在 或 uncle存在且为黑色节点{if (cur == parent->_right) // cur 在 parent 右侧{RotateL(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else // cur 在 parent 左侧{RotateR(parent);RotateL(grandfather);parent->_col = BLACK;grandfather->_col = RED;}break;}}

在这里插入图片描述

2.3 红黑树的验证

红黑树的验证,顾名思义,就是验证 你的“红黑树” 是否能满足红黑树的三条性质。

  • 根节点一定是黑色
  • 不能出现两个连续的红色节点
  • 对于同一高度而言,从根到该高度任一节点的简单路径上的黑色节点的数量相同
	bool IsBalance(){if (_root && _root->_col == RED) // 验证第一条性质{cout << "根节点为红色" << endl;return false;}// 要判断是否每一条路径上的黑色节点数相同,首先要找一个标杆 —— 这里旋转树最左路径的黑色节点个数Node* cur = _root;int RefBlackNum = 0;while (cur){if (cur->_col == BLACK)++RefBlackNum;cur = cur->_left;}return Check(_root, 0, RefBlackNum);}
	bool Check(Node* cur, int BlackNum, int RefBlackNum){if (cur == nullptr) //  走到 NIL 时,判断该路径黑色节点个数是否与标杆相同{if (BlackNum != RefBlackNum){cout << "路径黑色节点的个数不相同" << endl; // 验证第三条性质return false;}return true;}if (cur->_col == RED && cur->_parent && cur->_parent->_col == RED){cout << "存在两个连续的红色节点" << endl; // 验证第二条性质return false;}if (cur->_col == BLACK)++BlackNum;return Check(cur->_left, BlackNum, RefBlackNum) // 递归判断当前节点的左右子树是否合法&& Check(cur->_right, BlackNum, RefBlackNum);}

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

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

相关文章

借势母亲节h5小游戏的作用是什么

企业商家往往喜欢借势节日开展营销&#xff0c;母亲节作为5月的重要节日自然不可错过&#xff0c;不同行业商家都有自己开展互动想要实现的效果&#xff0c;如品牌宣传曝光、引流及渠道跳转等。 基于微信社交属性&#xff0c;有利于品牌发展&#xff0c;在【雨科】平台拥有多款…

基于web的物流管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Backpropagation反向传播算法【总结】

概念介绍 Backpropagation本质上就是一个提升Gradient Descent效率的算法&#xff0c;核心在于其可以有效率地计算出一个偏移量来update下一组未知参数。 难点在于&#xff1a;Neural Network有很多层&#xff0c;而且每层参数都非常多&#xff0c;所以不能立即算出来该组未知…

【Linux网络编程】高级IO——五种IO模型

高级IO 1.什么是IO&#xff1f;什么是高效的IO&#xff1f;2.有那些IO的方式&#xff1f;这么多的方式&#xff0c;有那些是高效的&#xff1f;3.五种IO模型4.高级IO重要概念5.非阻塞IO 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x…

C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

信息泄露中的目录遍历,phpinfo,备份文件下载

一、目录遍历漏洞 1.什么是目录遍历漏洞 指的是在没有授权的情况下读取文件&#xff0c;某些情况下还可对服务器里的文件任意写入 2.目录遍历漏洞成因 网站配置存在缺陷&#xff0c;对输入目录缺少验证&#xff0c;没过滤../之类的目录跳转符&#xff0c;可通过提交目录跳转…

超详细——集成学习——Adaboost——笔记

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…

AI绘画ComfyUI工作流安装教程,新手入门安装部署教程

ComfyUI 是专为 Stable Diffusion 打造的图形用户界面&#xff08;GUI&#xff09;&#xff0c;采用了基于节点的操作方式。用户可以通过连接不同的模块&#xff08;即节点&#xff09;来创建复杂的图像生成流程。这些节点涵盖了多样的功能&#xff0c;包括加载检查点模型、输入…

慧天卓特干旱监测系统:2023年云南最强冬春连旱分析

2023年开春以来&#xff0c;由于高温少雨&#xff0c;土壤失墒快&#xff0c;我国西南的云贵川渝等地区出现连续快速干旱&#xff0c;云南地区的干旱尤为严重。 2023年1月下旬至6月18日&#xff0c;云南平均降水量197.7毫米&#xff0c;为1961年以来历史同期最少&#xff0c;气…

生成requirements.txt文件

前言 对于Python项目&#xff0c;生成和使用requirements.txt是十分必要的。通过requirements.txt可以一次性保存和安装项目所需要的所有库。尤其是在复现github上的实验代码时。 方法1 常用的命令 pip freeze > requirements.txt然而这种方法并不好用&#xff0c;有时会…

什么是泛域名证书?与普通SSL证书有什么区别

随着互联网的发展&#xff0c;越来越多的网站开始使用SSL证书来保护用户的隐私和安全。在SSL证书中&#xff0c;泛域名SSL证书和普通域名证书是两种常见的类型。那么&#xff0c;什么是泛域名SSL证书&#xff0c;与普通域名证书有什么区别呢&#xff1f; 首先&#xff0c;我们来…

ChatGPT变懒原因:正在给自己放寒假!已被网友测出

ChatGPT近期偷懒严重&#xff0c;有了一种听起来很离谱的解释&#xff1a; 模仿人类&#xff0c;自己给自己放寒假了&#xff5e; 有测试为证&#xff0c;网友Rob Lynch用GPT-4 turbo API设置了两个系统提示&#xff1a; 一个告诉它现在是5月&#xff0c;另一个告诉它现在是1…

基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 遗传算法&#xff08;GA&#xff09;原理 4.2 BP神经网络原理 4.3 遗传优化BP神经网络结合应用 4.4 遗传算法简要改进 5.完整程序 1.程序功能描述 基于改进遗传优化的BP神经网络金融…

什么是影响力?HR招聘测评,如何考察候选人的影响力?

什么是影响力&#xff1f; 影响力也即是说服别人同你的观点&#xff0c;或者是潜移默化的改变他人&#xff0c;从而形成自我凝聚力&#xff0c;影响力可以推动某一个事务的进行。影响力尤其在管理型岗位上具有重要作用。 在百科中有如下定义&#xff1a;影响力是用别人乐于接受…

Python类方法探秘:从单例模式到版本控制

引言&#xff1a; 在Python编程中&#xff0c;类方法作为一种特殊的实例方法&#xff0c;以其独特的魅力在众多编程范式中脱颖而出。它们不仅提供了无需实例即可调用的便捷性&#xff0c;还在设计模式、版本控制等方面发挥着重要作用。本文将通过几个生动的示例&#xff0c;带您…

大厂常见算法50题-最小栈

专栏持续更新50道算法题&#xff0c;都是大厂高频算法题&#xff0c;建议关注, 一起巧‘背’算法! 文章目录 题目解法一 遍历找最小值&#xff08;不要求时间复杂度情况下&#xff09;解法二 辅助栈总结 题目 解法一 遍历找最小值&#xff08;不要求时间复杂度情况下&#xff0…

艾体宝方案 | 加密USB金融解决方案

在现代金融行业中&#xff0c;保护敏感数据和合规性已成为至关重要的任务。为了帮助金融公司应对移动性风险和合规挑战&#xff0c;我们提供了一种高效的加密USB解决方案。 一、为什么金融公司需要加密USB解决方案 1、降低移动性风险 金融服务公司正在迅速过渡到一种模式&a…

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广&#xff0c;还是国外的餐厅运营、参加国际展会&#xff0c;或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码&#xff0c;你都可以在QR Tiger去制作您需要的二维码&#xff01; 一、认识QR Tiger 二…

【Pytorch】3.Transforms的运用

什么是Transforms 在PyTorch中&#xff0c;transforms是用于对数据进行预处理、增强和变换的操作集合。transforms通常用于数据载入和训练过程中&#xff0c;可以包括数据的归一化、裁剪、翻转、旋转、缩放等操作&#xff0c;以及将数据转换成PyTorch可以处理的Tensor格式。 Tr…

高频次的低价监测如何实现

品牌在做控价的过程中&#xff0c;需要对渠道中的低价数据进行监测&#xff0c;但价格数据变化快&#xff0c;涉及的促销信息也很多&#xff0c;如何将这些变化的数据监测到位&#xff0c;同时对于低价的凭证还要截图留证&#xff0c;以便有效的进行渠道治理&#xff0c;这就需…