c++怎么实现一个红黑树_c++平衡二叉搜索树插入与旋转算法


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

c++怎么实现一个红黑树_c++平衡二叉搜索树插入与旋转算法

红黑树是一种自平衡的二叉搜索树(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;

}

Manus Manus

全球首款通用型AI Agent,可以将你的想法转化为行动。

Manus 250 查看详情 Manus

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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.