新闻中心

C++如何实现一个红黑树_C++数据结构与红黑树实现

2025-11-24
浏览次数:
返回列表
红黑树通过颜色规则和旋转维持平衡,确保操作时间复杂度为O(log n)。其节点含颜色、值及指针,新节点默认红色。左旋右旋调整结构,插入后按叔叔颜色等分情况修复,最终根节点染黑以满足性质。

c++如何实现一个红黑树_c++数据结构与红黑树实现

红黑树是一种自平衡的二叉查找树,它通过特定的颜色规则和旋转操作保证树的高度接近 log(n),从而确保插入、删除和查找操作的时间复杂度为 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* x) {
    Node* y = x->right;
    x->right = y->left;
    if (y->left != nullptr)
        y->left->parent = x;
    y->parent = x->parent;
    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;
}

右旋类似,交换 left 和 right 的角色即可。

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修

插入操作与修复

插入过程分为两步:按二叉搜索树方式插入,然后根据红黑性质进行修复。

修复主要处理三种情况:

  • 叔叔是红色:变色并上移问题节点
  • 叔叔是黑色且当前节点是右孩子:左旋调整形态
  • 叔叔是黑色且当前节点是左孩子:右旋并重新着色

修复函数大致如下:

void insertFix(Node* k) {
    while (k != root && k->parent->color == RED) {
        if (k->parent == k->parent->parent->left) {
            Node* u = k->parent->parent->right;
            if (u != nullptr && u->color == RED) {
                k->parent->color = BLACK;
                u->color = BLACK;
                k->parent->parent->color = RED;
                k = k->parent->parent;
            } else {
                if (k == k->parent->right) {
                    k = k->parent;
                    leftRotate(k);
                }
                k->parent->color = BLACK;
                k->parent->parent->color = RED;
                rightRotate(k->parent->parent);
            }
        } else {
            // 对称情况
        }
    }
    root->color = BLACK;
}

完整实现要点

一个完整的红黑树类应包括:

  • 私有成员:root 指针
  • 公共方法:insert(int)、remove(int)、search(int)
  • 辅助方法:rotateLeft、rotateRight、fixInsert、fixDelete

删除比插入更复杂,涉及更多情况判断,核心思路是将删除黑色节点引起的问题沿路径向上修复。

基本上就这些。实现红黑树的关键在于理解每种旋转和变色背后的逻辑——都是为了恢复那五条性质。虽然代码量较大,但只要分步处理,逐步调试,就能构建出稳定的结构。

以上就是C++如何实现一个红黑树_C++数据结构与红黑树实现的详细内容,更多请关注其它相关文章!


# 五条  # 文具故事类软文营销推广  # 广东公司网站建设公司  # seo网站排名优化工具是什么  # 北滘seo优化费用  # 百度地图关键词排名  # 拼多多查关键词排名官方  # 丹东网站建设公司排行  # seo推广基本操作快速排名  # 网站建设人工作介绍  # 小篮球训练营推广和营销  # 与其他  # node  # 如何使用  # 如何实现  # 都是  # 右旋  # 左旋  # 美图  # 数据结构  # 红黑  # red  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Python Socket多播通信中指定源IP地址的实践指南  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  c++如何实现单例设计模式_c++线程安全的单例模式写法  抖音创作助手登录入口_抖音创作辅助工具官网直达  J*aScriptWebpack优化_J*aScript构建工具实战  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  使用Python高效删除Word宏并转换DOCM为DOCX格式  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  谷歌推RCS信息存档功能:公司可监控员工私密信息!  微信聊天记录怎么加密_微信聊天记录加密方法  age动漫网站入口 age动漫官网直接访问入口  铁路12306的积分有效期是多久_铁路12306积分有效期说明  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  58动漫网在线官方网 58动漫网正版动漫入口网址  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  J*aScript数组对象转换:按指定键分组与值收集  抖音未来赚钱的新趋势 2025年值得关注的变现风口分析  12306选座怎么选到临时改签座_12306改签选座策略与步骤  j*a toString()的覆盖  海棠账号登录入口_登录海棠账户同步阅读记录  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  PDF文件体积过大处理_PDF压缩技巧详解  4399体育竞技小游戏_4399小游戏赛事入口  css绝对定位元素脱离父容器怎么办_确保父元素position非static  红果短剧网页版官网入口 官方最新网址发布  谷歌google账号注册详细步骤 谷歌账号注册官方教程  照顾宝贝2小游戏免费秒玩入口  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  深入理解Promise链:如何在catch后中断then的执行  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  《噬血代码2》新预告片发布 展示游戏剧情  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  绝地鸭卫平a核爆刀流玩法攻略  反效果?《战地6》免费试玩开启后玩家数不升反降  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  TikTok网页版直接登录 TikTok网页端官方平台入口 

搜索