新闻中心
c++怎么实现一个红黑树_c++平衡二叉搜索树插入与旋转算法
红黑树通过着色规则和旋转保持平衡,插入后修复以确保根黑、无连续红、黑高一致,C++实现包含左旋右旋与insertFixup,最终中序遍历验证有序性。

红黑树是一
种自平衡的二叉搜索树(BST),它通过为每个节点着色(红色或黑色)并遵循特定规则来保持树的近似平衡,从而保证查找、插入和删除操作的时间复杂度为 O(log n)。下面用 C++ 实现一个基础的红黑树,包含插入操作和必要的旋转调整逻辑。
红黑树的性质
在实现前先明确红黑树必须满足的五条性质:
- 每个节点是红色或黑色
- 根节点是黑色
- 所有叶子(NULL 节点)视为黑色
- 如果一个节点是红色,则它的两个子节点都是黑色(不能有两个连续的红色节点)
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点(黑高一致)
节点结构定义
每个节点需要存储值、颜色、左右子节点指针和父节点指针:
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;}
千鹿Pr助手
智能Pr插件,融入众多AI功能和海量素材
128
查看详情
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++平衡二叉搜索树插入与旋转算法的详细内容,更多请关注其它相关文章!
# ai
# node
# 如何使用
# 高一
# 右旋
# 左旋
# 红黑
# red
# stream
# ios
# c++
# ks免费刷粉网站推广马上刷
# 2018寄生虫seo
# 网站建设前要规划什么
# 屯溪关键词排名
# 丹东抖音seo精英招聘
# 综合网站推广的概念
# 天津网络营销推广电话
# 公司网站怎么百度推广
# yy seo
# 太平网页seo优化
# 放在
# 是一种
# 与其他
# 是一个
# 都是
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
mc.js官网登录入口 mc.js官方登录入口最新版
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
Win11怎么开启省电模式_Win11电池节电模式自动开启
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
2026春节假期票务安排_2026春节放假购票指南
免费抖音短视频入口_抖音网页版短视频免费通道
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
AO3最新镜像入口 Archive of Our Own官方平台访问
AO3网页版最新入口合集 Archive of Our Own在线访问指南
Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法
机器学习中对数变换预测结果的反向还原
Python自定义类排序:解决lambda键值访问TypeError的实践指南
Lar*el DB::listen 事件中的查询执行时间单位解析
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧
sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置
解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
基于动态规划的房屋花卉种植最小成本算法详解
PDF文件体积过大处理_PDF压缩技巧详解
随机参数递归函数的基准调用次数与时间复杂度探究
qq音乐在线播放入口_qq音乐电脑版登录链接
J*a里如何使用forEach遍历Map_Map遍历方法说明
构建轻量级网站内部消息系统:Formspree 集成指南
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
J*a应用程序首次运行自动创建文件与目录的最佳实践
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
如何使 Jest 模拟函数默认抛出错误以提高测试效率
学习通在线学习平台 学习通网页版直接进入课程中心
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
痛风发作了怎么办? 快速止痛和后期饮食调理
必由学官网首页入口 必由学教师网页版登录指南
支付宝如何设置安全保护_支付宝安全设置的全面教程
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
Animex动漫社网入口地址 Animex动漫社网正版在线入口
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
生成rdflib自定义SPARQL函数:参数匹配与实践指南
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
React Router v6 教程:构建认证保护的私有路由与重定向策略
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS


2025-11-11
浏览次数:次
返回列表