文章目录

  • 红黑树
    • 性质
  • 红黑树的插入
    • 前言
    • 寻找插入位置
    • 情况 1.0
      • 情况 1.1
      • 情况 1.2
      • 情况 1.3
    • 情况 2.0
      • 情况 2.1
      • 情况 2.2
      • 情况 2.3
  • 完整代码
  • 红黑树的检验
    • 验证代码和用例

红黑树

上篇文章我们说到 AVL 树在新增 / 减少结点的时候会进行旋转以保持 AVL 树的高度平衡, 但是实际上在需要 频繁加入 / 删除结点的场景中, AVL 树在旋转上开销会很大, 总体效率也会较为低下。

故而有这样一个数据结构——红黑树, 这里我们不再讨论平衡因子, 而是维护结点中的颜色(只有红或黑)来间接地调整树的「相对平衡」,也就是说红黑树的平衡并没有 AVL 树那样严格,所以相比 AVL 树,红黑树有的旋转次数会显著减少,我们来具体看看:

性质

如果一棵树是红黑树,它必然有如下性质:(这几条性质建议多熟悉一下)

  1. 结点只有红,黑两种属性(显而易见对吧,红黑树嘛)
  2. 根节点为黑色
  3. 叶子结点视为黑色,这里的叶子结点指的是最底层的空节点
  4. 不能存在两个连续的红色节点
  5. 从「任意节点开始到其后代叶子节点」的简单路径上,有「相同数量的黑色节点」

具备了以上几条性质,我们就能保证:红黑树最长路径是最短路径的两倍

因为在「从任意结点开始到叶子结点具有相同数量的黑色结点」和「不能连续存在两个红色结点」的限制,最短路径就是路径上 N 个点全是 黑色的,最长路径就是这 N 个黑色结点和 N 个红色结点交替出现,长度最多是2 N,故而具备了这个特点。

然后对于红黑树的节点,我们定义为:

 private static class RBTreeNode {private RBTreeNode parent;private RBTreeNode left;private RBTreeNode right;private COLOR color;     // 结点颜色int val ;}// 在另一个 Java 文件中public enum COLOR {BLACK, RED}

红黑树的插入

前言

首先对于一个新节点的插入,这个新节点我们需要先默认设置为红色,那为什么不设置成黑色呢?

  • 在插入新节点之前,这棵树肯定已经是红黑树了,那么它就满足性质4(任意结点节点到叶子结点路径上黑色节点个数相等),而如果这时候插入一个黑色的节点,那肯定会破坏这个性质。
  • 而我们设定新节点为红色的,那只是可能会破坏性质3(不存在连续两红),但是我们可以通过修改结点颜色或者树的结构来纠正这棵红黑树

寻找插入位置

接下来开始我们的红黑树插入阶段:
如果红黑树的根节点为空,那么这个新节点设置为根节点即可,再将这个点的颜色设为黑色(因为新节点默认是红色, 且根节点为黑)

否则:
我们就要寻找新节点的插入位置了,这和 AVL 树对应的代码是一样的(二分,然后连接新节点),这里直接上代码

public boolean insert(int val) {RBTreeNode newNode = new RBTreeNode(val);if (root == null) {root = newNode;root.color = BLACK; // 根节点颜色为 黑return true;}// 寻找插入位置RBTreeNode parent = null;RBTreeNode cur = root;while (cur != null) {if (cur.val < val) {parent = cur;cur = cur.right;} else if (cur.val > val) {parent = cur;cur = cur.left;} else {return true; // 重复节点}}// 至此 cur 为空,parent 为 cur 的父节点// 完成节点的插入if (parent.val > val) {parent.left = newNode;} else {parent.right = newNode;}newNode.parent = parent; // 双向连接}

接着,我们来熟悉一下这几个结点

红黑树的插入与验证——附图详解相关推荐

  1. 红黑树详解(二)红黑树的插入(附动图和案例)

    红黑树详解(二)红黑树的插入(附动图和案例) 摘要: 在很多源码涉及到大量数据处理的时候,通常都是用红黑树这一数据结构.红黑树是一种自平衡的二叉查找树,它能在进行插入和删除操作时通过特定操作保持二叉查 ...

  2. 红黑树的实现与验证--C++

    红黑树的实现与验证--C++ 红黑树实例: 在说红黑树之前,我们先来认识一下它: 首先强调一点:红黑树也是二叉搜索树.那么它就满足二叉搜索树的性质,除此之外,他还有几个比较特殊的性质,了解这些, ...

  3. Python实现红黑树的插入操作

    Python实现红黑树的插入操作 本专栏中的上一篇文章介绍了什么是红黑树,以及红黑树的旋转和变色. 参考:https://blog.csdn.net/weixin_43790276/article/d ...

  4. 彻底理解面试难点之rb-tree(红黑树)续--对红黑树的插入和删除操作的一些理解!!!

    这里主要讲一下对红黑树的插入和删除操作的一些理解 对于红黑树的一些相关性质的介绍,上篇已经讲了,这里不再介绍,有需要了解的,可以翻前面的博客看看. 1.红黑树的插入操作 对于红黑树的元素插入,我们首先 ...

  5. 红黑树从头至尾插入和删除结点的全程演示图

    红黑树插入和删除结点的全程演示 作者:July.saturnman. 时间:二零一一年三月二十八日. 出处:http://blog.csdn.net/v_JULY_v. 声明:版权所有,侵权必究. - ...

  6. 红黑树及其插入、删除操作

    在二叉搜索树中,基本操作如结点的插入.删除.查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示).因此我们需要对二叉搜索树做出 ...

  7. 红黑树检索/插入/删除

    正文 红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态.现在在脑海想 ...

  8. jQuery Validate验证框架详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.导入js库 <script type="text/javascript" src="& ...

  9. php微信小程序物流进度推送,微信小程序 消息推送php服务器验证实例详解

    微信小程序 消息推送php服务器验证实例详解 设置页面("设置">>"开发设置"): 1.设置服务器域名 注意http和https协议的不同. 2. ...

最新文章

  1. NODEJS 使用 XLSX模块导出excel文件
  2. 利用sharding-jdbc分库分表
  3. 百度开源的 71 个项目,看看你用过几个?
  4. C#3.0笔记(五)Lambda表达式
  5. CCNA Discovery第二学期 (版本 4.1)
  6. 笔记-高项案例题-2015年上-整体管理
  7. 架构师修练 I - 超级代码控
  8. 如何把薪资谈高一倍?请看大厂offer拿到手软的ML大神自述
  9. zookeeper的名词复盘-Watcher
  10. java.net.SocketException: Broken pipe问题解决
  11. unreal4怎么设置游戏模式_ue4(虚幻4)基础 Unreal4 服务器模式详细介绍
  12. python对象特性教学_Python三个面向对象特性多态性的实用解释,实践,解读,丨,三大,特征,之...
  13. Übersicht for mac(自定义桌面工具)v1.6(68)最新版
  14. Python 正则表达式模块详解
  15. matlab cpu序列号,获取cpu序列号 - huhaoren的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. 小米路由器MINI架设WEB服务
  17. PowerBuilder反编译,PowerBuilder 反编译
  18. 动态电路中的动态元件——电容和电感
  19. android内部测试注册,马化腾也感受到了压力,开启微信号修改内测,安卓和iOS都可以...
  20. java nio wakeup_Java NIO 的 wakeup 剖析

热门文章

  1. 原型图设计软件哪个好用?6款好用软件推荐
  2. 禁止acer care center开机自动启动
  3. cad计算机绘注意事项,CAD打印的基本操作和重要的注意事项
  4. 两个互质整数的线性组合问题
  5. R语言基于ARCH模型股价波动率建模分析
  6. 工业循环水浅层砂过滤器(励进浅层介质过滤器)介绍及现场案例图
  7. 请问怎样取三位数的百位数,个位数,和十位数呢 (拆分)?
  8. Android点将台:烽火狼烟[-Handler-]
  9. 微信小程序-刷新当前页
  10. 正则表达式验证生日手机号信息