Red Black Tree 的一点感想

本贴最后更新于 2532 天前,其中的信息可能已经天翻地覆

红黑树的基本性质

  1. 每个节点或是红色的,或是黑色的。
     2) 根节点是黑色的。
     3) 每个叶节点(NIL)是黑色的。
     4) 如果一个节点是红色的,则它的两个子节点都是黑色的。
     5) 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

红黑树插入时,如果插入红色节点则
(由于插入黑色节点一定会导致性质五被破坏,所以考虑插入为红色节点的情况)

  1. 性质一不会破坏
  2. 性质二可能破坏
  3. 性质三不会被破坏
  4. 性质四可能被破坏
  5. 性质五不会被破坏

当插入导致性质被破坏时需要调整:
由上面所述,只有性质二和四可能被破坏,而性质二只有在插入之前为空树时可能被破坏。所以我们需要关注性质四,即插入导致两个红色节点连在了一起。下面分情况表述:

  • **1.插入的节点为根节点:**若插入前无任何节点,则插入后的节点为根节点直接设置为黑色即可。
  • **2.插入的节点的父节点为黑色节点:**无需做任何改变因为不会影响红黑树性质
  • 3.插入的节点的父节点为红色且 uncle 节点也是红色: 此时将导致两个红色节点连接到了一起,此时我们考虑改变两个红色节点之中的一个,然而改变插入节点的颜色显然是无意义的,(如果改变相当于插入黑色节点),所以我们将插入节点的父节点设置为黑色,然而这样同时会导致性质五的违背,所以我们将其 uncle 节点也设置为黑色,并将 parent 的 parent 节点设置为红色,此时调整完成。插入节点为 M,如下图:
    3d65bdf1eef44c8d9856bcc9dba0f572-image.png
    (图片来源于网络)
  • **4.插入节点的父节点为红色且 uncle 节点为黑色(T.nil 也为黑色),插入节点为右节点:**以插入节点的的父节点作为支点左旋变成情况 5,再调整

    (图片来源于网络)
  • **5.插入节点父节点为红色,uncle 节点为黑色(T.nil 为黑色),插入节点为的左子节点:**将 parent 节点设置为黑色,parent 的 parent 节点设置为红色,并以 parent 节点为支点右旋。

    (图片来源于网络)
    删除节点:
    当我们删除一个节点时,z 指向删除节点,y 指向替换删除删除节点的节点,x 指向 y 的右子树,首先按照二叉搜索树的的删除方式进行删除,并在其中加入部分代码记录 Y 的踪迹和 y 的初始颜色,还有 x 的踪迹(见《算法导论》第三版 183 页)。
    删除节点的过程:当 z 只有一个子树时,y 指向该子树,并直接将子树 y 替换 z,当 z 有两个子树时选择右子树的最左侧节点作为 y,并用 y 替换 z,并用 x 替换 y,并进行 red-black tree 调整。
    所以实际过程相当于删除 Y

当 y 是红色时,删除后不会影响红黑树的基本性质,可直接删除

当如果 y 是黑色,会出现如下三种情况:
1.如果原先的 y 是根节点,y 的红色 x 替换 y 将导致违反性质 2
2.如果替换后 x 和 x 的父节点都为红色则违反性质 4
3.y 在树中移动将导致包含 y 的任何简单路径和高度减一。

所以我们需要对 y 为黑色节点时被 x 替换后的树进行调整。
由于懒得画图使用网络图片~~~~这时 N 上文所述的 x
1.如果 N 的兄弟节点为红色时
将 B 设置为黑色,N 的父节点 P 设置为红色,然后以 P 为中心左旋转,则转换情况 2

(图片来源于网络)

2.如果 N 的兄弟节点为黑色,并且两个子节点都为黑色(包括 T.nil):
将 N 的兄弟节点 B 变红,然后用 N 的父节点 P 作为新的 N,进行递归操作。因为 N 是 P 的左子树,P 的左子树路径中,删除 N 后,会缺少一个黑色节点,因此递归的将右树上的路径也减少一个黑色节点,知道 N 的颜色为红色。最后把当前的 N 节点置为黑色。最后产生的结果就是将右侧的黑色节点上移,这样右子树和左子树都没有减少黑色节点。

(图片来源于网络)
3.如果 N 的兄弟节点 B 是黑色的他的左孩子为红色,右孩子为黑色
将 B 变红,b1 变黑,然后以 B 为中心右旋,则转换为情况 4

(图片来源于网络)
4.如果 N 的兄弟节点 B 是黑色他的右孩子为红色,左孩子可红可黑
将 B 的颜色设置为与 P 的颜色一致,然后 P 和 b2 设置为黑色,以 P 为中心左旋。

(图片来源于网络)
至此正文结束
分割线------------------------------------------------------------------------
花了我整整一下午加一晚上时间才看懂了此算法,并立刻跟新博客,也为以后如果忘记也是一个不错的复习资料,不过很开心今晚的迎新晚会很棒棒~~~~~~,不早了再不睡要猝死啦。。。。。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 510 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • abitmean

    有点意思就行了

    30 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 4 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    70 引用 • 375 回帖 • 1 关注
  • danl
    132 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 29 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 653 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 260 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 374 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 996
    13 引用 • 200 回帖 • 6 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    6 引用 • 38 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    222 引用 • 473 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    133 引用 • 189 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 391 关注