红黑树通过着色规则和旋转保持平衡,插入后修复以确保根黑、无连续红、黑高一致,C++实现包含左旋右旋与insertFixup,最终中序遍历验证有序性。

红黑树是一种自平衡的二叉搜索树(BST),它通过为每个节点着色(红色或黑色)并遵循特定规则来保持树的近似平衡,从而保证查找、插入和删除操作的时间复杂度为 O(log n)。下面用 C++ 实现一个基础的红黑树,包含插入操作和必要的旋转调整逻辑。
在实现前先明确红黑树必须满足的五条性质:
每个节点需要存储值、颜色、左右子节点指针和父节点指针:
enum Color { RED, BLACK };
<p>struct Node {
int data;
Color color;
Node <em>left, </em>right, *parent;</p><pre class='brush:php;toolbar:false;'>Node(int data) : data(data), color(RED), left(nullptr), right(nullptr), parent(nullptr) {}};
旋转是维持红黑树平衡的核心操作。左旋用于处理右倾情况,右旋用于处理左倾中的特定问题。
void leftRotate(Node* &root, Node* x) {
Node* y = x->right;
x->right = y->left;
if (y->left != nullptr)
y->left->parent = x;
y->parent = x->parent;
<pre class='brush:php;toolbar:false;'>if (x->parent == nullptr)
root = y;
else if (x == x->parent->left)
x->parent->left = y;
else
x->parent->right = y;
y->left = x;
x->parent = y;}
Manus
全球首款通用型AI Agent,可以将你的想法转化为行动。
250
查看详情
void rightRotate(Node &root, Node y) { Node* x = y->left; y->left = x->right; if (x->right != nullptr) x->right->parent = y; x->parent = y->parent;
if (y->parent == nullptr)
root = x;
else if (y == y->parent->left)
y->parent->left = x;
else
y->parent->right = x;
x->right = y;
y->parent = x;}
插入新节点后,可能破坏红黑性质,需进行修复。新节点默认为红色,然后根据父节点颜色和叔节点状态分情况处理。
void insertFixup(Node* &root, Node* z) {
while (z != root && z->parent->color == RED) {
if (z->parent == z->parent->parent->left) {
Node* uncle = z->parent->parent->right;
if (uncle != nullptr && uncle->color == RED) {
// 情况1:叔节点为红
z->parent->color = BLACK;
uncle->color = BLACK;
z->parent->parent->color = RED;
z = z->parent->parent;
} else {
// 情况2:叔节点为黑且当前节点为右孩子
if (z == z->parent->right) {
z = z->parent;
leftRotate(root, z);
}
// 情况3:叔节点为黑且当前节点为左孩子
z->parent->color = BLACK;
z->parent->parent->color = RED;
rightRotate(root, z->parent->parent);
}
} else {
Node* uncle = z->parent->parent->left;
if (uncle != nullptr && uncle->color == RED) {
z->parent->color = BLACK;
uncle->color = BLACK;
z->parent->parent->color = RED;
z = z->parent->parent;
} else {
if (z == z->parent->left) {
z = z->parent;
rightRotate(root, z);
}
z->parent->color = BLACK;
z->parent->parent->color = RED;
leftRotate(root, z->parent->parent);
}
}
}
root->color = BLACK; // 根节点始终为黑
}
<p>void insert(Node<em> &root, int data) {
Node</em> z = new Node(data);
Node<em> y = nullptr;
Node</em> x = root;</p><pre class='brush:php;toolbar:false;'>while (x != nullptr) {
y = x;
if (z->data < x->data)
x = x->left;
else
x = x->right;
}
z->parent = y;
if (y == nullptr)
root = z;
else if (z->data < y->data)
y->left = z;
else
y->right = z;
insertFixup(root, z);}
以下是一个简单的测试主函数:
#include <iostream>
using namespace std;
<p>// 上述所有代码放在这里</p><p>void inorder(Node* root) {
if (root != nullptr) {
inorder(root->left);
cout << root->data << " ";
inorder(root->right);
}
}</p><p>int main() {
Node* root = nullptr;
insert(root, 10);
insert(root, 20);
insert(root, 30);
insert(root, 15);
insert(root, 25);</p><pre class='brush:php;toolbar:false;'>cout << "Inorder tr*ersal: ";
inorder(root);
cout << endl;
return 0;}
基本上就这些。这个实现涵盖了红黑树插入和旋转的核心机制。虽然没有包含删除操作(更复杂),但已足够理解其平衡原理。实际工程中可考虑使用 std::set 或 std::map,它们底层正是基于红黑树实现的。
以上就是c++++怎么实现一个红黑树_c++平衡二叉搜索树插入与旋转算法的详细内容,更多请关注其它相关文章!
# 都是
# 无锡seo外包公司价格
# 株洲网站建设行不行
# 咸宁网店seo推广公司排名
# 佛山营销推广推荐品牌
# 活动营销推广计划英语
# 营销推广试用期个人总结
# 太原百度网站收录优化
# 谷得网站建设推广
# 河北推广营销有哪些
# 小吃线上营销推广方法怎么写
# 内存管理
# 是一个
# node
# 如何使用
# 高一
# 右旋
# 自定义
# 左旋
# 数据结构
# 红黑
# red
# stream
# ios
# c++
# ai
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
126邮箱网页在线登录2025_126邮箱网页版入口官方地址
Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧
《杖剑传说》食谱大全
如何在vscode中关闭it环境
网页版网易云音乐入口_网易云音乐在线官网登录
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
漫蛙漫画直连入口 _ manwa官方备用入口实时检测
Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程
Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】
中通快递官网指定查询 中通快递单号查询平台入口
解决Go encoding/json 将JSON大数字解析为浮点数的问题
Python模块化编程:避免循环导入与共享函数的最佳实践
mysql数据库索引类型有哪些_mysql索引类型解析
PHP页面重载时变量值不重置的实现方法
如何自定义苹果手机铃声
J*a实现任务清单管理_集合框架综合入门练手
iPhone14开启Apple TV遥控设置
《洛克王国:世界》国家队搭配攻略
《虎扑》关闭社区内容推荐方法
哔哩哔哩黑名单怎么查看
《360浏览器》自动保存账号密码设置方法
实时数据流中高效查找最小值与最大值
动漫岛在线动漫网 动漫岛动漫在线观看官方入口
研招网官方网站招生平台入口_中国研究生招生信息网官网登录
mail.qq.com登录入口 QQ邮箱网页版直达
以下哪一个是适应长期护理制度发展而设立的新职业
抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法
如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法
VS Code如何设置默认配置
在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明
《sketchbook》选中部分图案移动方法
PHP utf8_encode 字符编码转换疑难解析与最佳实践
《咸鱼之王》新版孙坚技能解析
《暗黑破坏神4》国服回归送狂欢礼包 价值6916元
手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧
利用Flexbox实现图片元素的二维布局:2x2网格排列指南
解决异步Python机器人中同步操作的阻塞问题
汽水音乐车机版 汽水音乐车机版官方入口
《金山词霸》语音翻译方法
百度识图图像分析 百度识图识别平台
掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析
J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践
Golang如何使用log记录日志信息_Golang log日志记录方法总结
追剧达人如何发弹幕
TikTok视频播放中断怎么办 TikTok播放异常修复方法
iPhone12是否要更新ios16
J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解
虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
2025-11-11
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。