算法导论 13章 红黑树

《算法导论》第三版第13章 红黑树 练习&思考题 个人答案 13.1 红黑树的性质 13.1-1 解: 完全二叉搜索树: 黑高为2的红黑树: 黑高为3的红黑树: 黑高为4的红黑树: 13.1-2 解:如果标红,不满足性质4,因为35是36的父结点,也是红色;如果标黑,不满足性质5,该条路径黑高超过其他路径。 13.1-3 解:可以验证所得到的树仍然满足5个条件,所以是红黑树。 13.1-4 解: (1)如果“吸收”前两个子结点都已经是黑色了,度为2... 阅读详情

红黑树的性质

1,每个节点非黑即红。
2,根节点是黑色的。
3,叶节点(NIL)是黑色的。
4,红节点的两个孩子都是黑色的。
5,对每个节点,从该节点到其所有后代的简单路径上,均包含了同样数目的黑节点。

旋转

为了维持红黑树的性质,要改变某些节点的颜色和指针结构,旋转改变了指针结构。

左旋:以x和y之间的链为“支轴”进行的,使得x的右孩子为y的左孩子,y的父节点为x的父节点,y的左孩子为x。
代码:
template <class T>
    void RedBlackTree<T>::left_rotate(RedBlackTreeNode<T> *pnode)
{
        RedBlackTreeNode<T>* rightnode = pnode->right;
        pnode->right = rightnode->left;`
        if(rightnode->left != NIL)
            rightnode->left->parent = pnode;
            rightnode->parent = pnode->parent;
        if(pnode->parent == NIL)
            root = rightnode;
        else if(pnode == pnode->parent->left)
            pnode->parent->left = rightnode;
        else
            pnode->parent->right = rightnode;
            rightnode->left = pnode;
            pnode->parent = rightnode;
}

插入

每次插入节点,至多只有一个性质性质被破坏,性质2或者4

  1. 如果是性质2,则将根节点变为黑色即可。

  2. 违反性质4,必定因为它和它的父亲都为红色,则其祖父节点必为黑色。此时根据父亲是祖父的左孩子还是右孩子进行讨论,左右之间是对称的,书中只给出了左孩子的三种情况。

情况1: z的叔叔结点y是红色的

将祖父染为红色,父亲和叔叔染为黑色,将祖父变成判定点,一直向上循环判断。

情况2:z的叔叔y是黑色的,而且z是右孩子
情况3:z的叔叔y是黑色的,而且z是左孩子

情况2可以通过旋转变为情况3.之后,将父亲染成黑色,祖父染成红色,再从祖父处进行右旋转。过程中不会对其他红黑树性质造成破坏。

删除

删除过程与二叉查找树一样,分为三种情况

    <1>无左右孩子、<2>有左孩子或者右孩子、<3>既有树=左孩子又有右孩子。

但删除后还得检查是否破坏红黑树性质。

    如果删除的是黑节点,会破坏红黑树性质。

违反性质的三种情况:

    1:若删除的是根节点,唯一子节点为红色,则根节点变成红色,违反了性质2.
    2:若被删节点的唯一孩子和父亲都是红色,性质4被破坏.
    3:被删节点会导致包含该点的路径的黑节点树-1,违反了性质5. 

额外一重黑色:

顶替被删节点的节点还有一重额外的黑色,此时可能违背了性质1(红+黑),但在这种假设下,性质5成立。节点额外的黑色是针对X节点的,不是反映在color属性上的。

函数修复性质1,2,4:

性质2、4很简单,因为X为红色,所以将X变为黑色即可。

性质1:函数的目的是将额外的黑色沿树上移,直到:

    X指向红黑节点,将x着为黑色。
    X指向根节点。
    执行适当的旋转和重新着色,退出循环。

注意
X总是指向具有双重黑色的非根节点。
w不可能是T.nil
性质5交换前后不变

四种情况:

情况1:x的兄弟w是红色的
    此时因为x是双重黑色,贡献两个黑色结点,所有w必有黑色孩子。此时将w着为黑色,父亲着为红色,在对父亲做一次左旋转。此时x的新兄弟w是黑色,这样将情况1转换为情况2、3或4。
情况2:x的兄弟w是黑色的,而且w的两个孩子都是黑色的。
     处理过程是从x和w上去掉一重黑色,即x只有一重黑色而w着为红色,给x的父节点添加额外黑色。
情况3:x的兄弟w是黑色的,w的左孩子是红色的,右孩子是黑色的
    交换w和其左孩子的颜色,并对w进行右旋转。旋转后x的新兄弟w是一个有红色右孩子的黑结点,转换成了情况4。
情况4:x的兄弟w是黑色的,而且w的右孩子是红色的。
    执行过程是将w的颜色设置为父亲的颜色,将父亲的颜色设置为黑色,将w的右孩子着为黑色,然后在父亲做一次右旋,最后将x设置为根root。

1.1

                8                               
        4               12              
    2       6       10      14      
  1   3   5   7   9   11  13      15    
                8                               
        4(红)            12(红)           
    2       6       10      14      
  1   3   5   7   9   11  13      15    
                8                               
        4(红)            12(红)           
    2       6       10      14      
  1   3   5   7   9   11  13      15    (全红)

1.2

不是,违反了性质4,。不是,违反了性质5。

1.3

是

1.4

此时的叶节点深度为黑高度

1.5

红节点的数目<=黑节点数,全为黑节点的路径为红黑相等路径的一半

1.6

2^2k-1  2^k-1

1.7

2:1
0
学习 《算法导论》第13章 红黑树 总结二 学习 《算法导论》第13章 红黑树 总结二在学习 《算法导论》第13章 红黑树 总结一中学习了红黑树的五个性质,红黑树的结构定义以及旋转。这节学习红黑树的插入和删除操作。红黑树的插入在一棵n个结点的红黑树中插入一个新结点的操作可以在O(lgn)时间内完成。红黑树的插入分为两步:第一步:把红黑树当成是一棵普通的二叉查找树,把新结点插入这棵二叉查找树;第二步:为保证红黑树的性质,将插入的新结点着色.第一 阅读详情

相关推荐

算法导论第13(十三)章红黑树

红黑树是一般的二叉查找树的一种较为”平衡的“

z84616995z的专栏 1万+

算法导论 第13章 红黑树

一、概念 1.定义与性质 (1)定义 红黑树字义:满足(a)每个结点或是红的,或是黑的(b)根结点是黑的(c)每个叶结点(NIL)是黑的(d)如果一个结点是红的,则它的两个儿子是黑的(e)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点的二叉查找树称为红黑树。 黑高度定义:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上的黑色结点的个数称为x的黑高度。 (2

幸福在路上 1万+

算法导论习题答案13.3-2

算法导论习题答案13.3-2, 需要安装OpenOffice 打开。

算法导论 第13章 红黑树(图文详细解说)

二叉查找树的基本操作包括搜索、插入、删除、取最大和最小值等都能够在O(h)时间复杂度内实现,因此能在期望时间O(lgn)下实现,但是二叉查找树的平衡性在这些操作中并没有得到维护,因此其高度可能会变得很高,当其高度较高时,而二叉查找树的性能就未必比链表好了,所以二叉查找树的集合操作是期望时间O(lgn),最坏情况下为O(n)。 红黑树也是一种二叉查找树,它拥有二叉查找树的性质,同时红黑树还

程序缘 3072

算法导论13章习题答案CLRS

算法导论第三版13章的习题答案,配图,很详细

算法导论第十三章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

《算法导论》笔记 第13章 总结与思考

【总结】 【思考】

Azarath Metrion Zinthos 751

算法导论习题答案13.3-1

算法导论习题答案13.3-1,需要安装OpenOffice 打开。

《算法导论》第13章 红黑树

  《算法导论》第13章红黑树,内容及练习题。百度网盘:链接:https://pan.baidu.com/s/1yl7GxuhNs5_oAa2nYd_jJg 密码:6r3f 转载于:https://www.cnblogs.com/lijunqiang1997/p/8981713.html...

weixin_30613433的博客 112

银河麒麟Arm64 v10 sp1系统QT5.12.8离线环境配置全攻略

本文详细介绍了在银河麒麟Arm64 v10 sp1系统上配置QT5.12.8离线开发环境的完整流程。从安装包获取、依赖检查到环境变量配置,逐步指导开发者解决飞腾处理器架构下的常见问题,包括OpenGL库冲突、中文乱码处理等,特别适合军工、政务等需要离线部署的场景。

weixin_26899659的博客 507

PC微信逆向:破解聊天记录文件!_读取别人pc微信msg文件

本文详细介绍了PC版微信数据库的解密方法,总结了前人经验并补充了关键细节。通过OllyDbg调试工具从微信内存中获取32字节加密密钥,使用C++结合OpenSSL库实现解密程序。重点解决了开发环境配置问题,包括Visual Studio项目设置和OpenSSL库的版本适配,将原本固定的数据库路径改为参数化输入,提高了工具的通用性。该方案为电子取证中的微信数据提取提供了完整的技术路径,避免了研究者重复探索已解决的问题。

zz96405784848的博客 9756

《算法导论》第 13 章 - 红黑树

红黑树是一种高效的自平衡二叉搜索树,通过颜色标记和旋转操作维护平衡性,确保查找、插入、删除等操作的时间复杂度为O(logn)。本文系统介绍了红黑树的五大性质、核心旋转操作,以及插入和删除的详细实现逻辑。文中提供了完整的C++代码实现,包括节点结构定义、左旋/右旋操作、插入修复和删除修复等关键算法,并附有测试用例展示红黑树的实际应用。相比AVL树,红黑树采用"宽松平衡"策略,更适合频繁修改的场景,被广泛应用于C++ STL、Java集合框架等标准库中。代码实现中采用哨兵节点技巧简化边界处理

2302_80961196的博客 1319

新手必看!华为S5700交换机健康检查清单:从CPU到日志的完整巡检流程

本文为新手网管人员提供华为S5700交换机的健康检查完整指南,涵盖CPU、内存、温度、日志等核心指标的日常维护流程。通过详细的display命令和实用案例,帮助用户快速掌握设备体检技巧,确保交换机稳定运行。

weixin_29251337的博客 237

学习 《算法导论》第13章 红黑树 总结一

学习 《算法导论》第13章 红黑树 总结一前面学习了二叉查找树,我们知道一棵高度为h的二叉查找树实现的任何一种动态集合操作,其时间都是O(h); 但若二叉查找树退化为n个结点的线性链后,则最坏情况运行时间为O(n); 下面说的红黑树能保证在最坏情况下,任何一种动态集合操作的运行时间为O(h);红黑树介绍红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或BLACK;通

wan198809的专栏 1847

冗余位技术在SAR ADC中的动态误差恢复机制解析

本文深入解析了冗余位技术在SAR ADC中的动态误差恢复机制,详细介绍了其基本概念、动态误差产生原因及冗余位的容错空间设计、时序松弛策略和数字校正算法。通过实际电路设计案例和数学建模,展示了冗余位技术如何显著提升ADC的精度和能效比,同时探讨了未来发展方向。

weixin_28335283的博客 975

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1417

学习 《算法导论》第13章 红黑树 总结三

学习 《算法导论》第13章 红黑树 总结三今天把这编博客写完吧,这里学习红黑树的删除操作,前面学习了 红黑树的定义及旋转 红黑树的插入操作红黑树的删除操作也要结合二叉查找树的删除操作来学习。在一棵n个结点的红黑树中删除一个结点也是一样的,要花O(lgn)的时间,删除操作比插入还要复杂!!!!删除也分为两步:第一步,当成二叉查找树处理,删除一个结点;第二步,修复红黑树的性质;第一步:删除结点第一步

wan198809的专栏 554

YOLOv11涨点改进 | 全网独家首发、特征融合创新篇 | ACM 2025顶会 | 引入DAAttn差异感知注意力融合模块,通过动态调整注意力,使模型更准确地识别关键内容,提高精度、并减少冗余计算

本文提出了一种基于DAAttn(差异感知注意力融合)模块改进的YOLOv11模型,用于提升变化检测任务的性能。DAAttn模块通过动态加权特征差异,有效区分有意义变化与噪声(如光照、天气变化),显著提高了模型在复杂场景下的检测精度。该模块采用反转注意力机制,重点关注显著差异区域,同时减少计算冗余。实验表明,改进后的模型在保持计算效率的同时,能够更准确地识别小目标和细节变化。文章详细介绍了DAAttn的原理、优势、实现代码及其在YOLOv11中的集成方法,并提供了两种改进配置方案。

Ai缝合怪、助力小伙伴高效发论文 302

算法导论-第13章-红黑树

第12章介绍了一棵高度为h的二叉搜索树,它可以支持任何一种基本动态集合操作,如SEARCHSUCCESSORMINIMUMMAXIMUMINSERT和DELETE等,其时间复杂度均为Oh。因此,如果搜素树的高度较低时,这些操作会执行的较快。然而,如果树的高度较高时,这些操作可能不比在链表上执行得快。(red-black tree)是“平衡”搜索树的一种,可以保证在最坏情况下基本动态集合操作得时间复杂度为Ologn。

优快云博客 520

〖Python网络爬虫实战㊴〗- 极验滑块介绍(一)

我们对这个看到不陌生,现在,大多数平台都是用的是这个平台的验证码,我们今天来学习一下,极验滑块验证码的逆向,其他的都差不多。我们了解到这个平台提供了许多验证的方式。现在大多数还是滑块比较多,滑块验证码是一种常见的验证方式,其主要思路为用户通过拖动滑块来完成验证。具体流程如下:首先,用户需要进行滑块验证码的操作,网站会向用户展示一张图片,图片上通常会有一些随机的文字和背景干扰。用户需要通过鼠标拖动滑块,将其移动到指定位置上,通常是将滑块拖动到图片的相应位置上来完成验证。

爱吃饼干的小白鼠的博客 2879

【功能安全】【AutoSAR】程序流监控机制

目录 一、程序流执行的常见故障 二、程序流的监控机制 1、监控功能的实现 2、三种监督机制 a、生命监测机制 b、截止时间监测机制 c、逻辑程序流监测机制 一、程序流执行的常见故障 与程序流相关的故障,在ISO26262中第六章附录D中定义如下: — 执行阻塞; — 死锁; — 活锁; — 执行时间的不正确分配; — 软件要素间的不正确同步。 二、程序流的监控机制 1、监控功能的实现 AutoSAR中对程序流的监控功能的实现主要有“看门狗”栈(Watchdog Stack).

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4519

《算法导论》笔记 第13章 13.1 红黑树的性质

【笔记】 一棵二叉树如果满足下面的红黑性质,则为一棵红黑树 1) 每个节点 【练习】

Azarath Metrion Zinthos 1349

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: struct和class的比较
下一篇: 算法导论 15章 动态规划
cqcpp
博客等级 码龄12年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值