红黑树满足的性质:

  1. 所有结点不是红的就是黑的
  2. 根结点是黑色的
  3. 不能有连续的红色结点
  4. 每一条从根到叶子结点(空结点)的路径上,黑色结点数量相同
  5. 所有的叶子结点(空结点)都是黑色的

插入后需要调整情况

构建红色结点进行插入,如果插入位置的父亲结点是红色的就需要进行调整,因为不能有连续的红色结点。

情况一:叔叔存在,且为红



解决思路:
由于不能有连续的红色结点,所以考虑把父亲parent变为黑色。但是原来parent和uncle为根的子树中,所有路径的黑色结点数量是一样的。现在parent为根的子树中,所有路径上的黑色结点数量就比uncle子树多了一个,为了维持性质,uncle也需要变成黑色。

显然这是不够的,因为上图中有可能只是其他树的部分子树而已

原来整个树中从根结点到叶子节结点的所有路径上黑色结点数量是一样的,现在以grandparent为根的子树中,黑色结点多了一个,为了维持性质,就必须把grandparent变成红色。

当然,这只是我们的假设,grandparent也有可能就是根结点,为了防止这种事情发生,不管整棵树的根结点再此之前被我们变成了什么颜色, 最后都需要将整棵树的根结点强制变成黑色的。

叔叔存在且为红:将父亲和叔叔变成黑色,祖父变成红色,整棵树的根结点最后强制整成黑色。

情况二:叔叔不存在 或者 叔叔存在且为黑(LL/RR型,例如parent为左子树、cur为左子树)


1.如果叔叔不存在,那么cur一定是新插入的结点。第一点,因为叔叔不存在意味着grandparent的左子树中也不存在黑色结点。第二点,若cur不是新插入的,考虑性质不能有连续的红色的结点,那么cur原来必定是黑色的,这就与第一点相悖。故而,cur一定是新插入的结点。

2.叔叔存在且为黑,那么cur必定不是新插入的结点。因为每一条路径上的黑色结点数量相同,而叔叔已经是黑色的了,cur就必须有孩子,而且cur的孩子中每一条路径都至少有一个黑色结点。故而,cur一定不是新插入的结点,而是调整时被改成红色的。

叔叔不存在 或者叔叔存在且为黑:
1.如果parent是grandparent的左孩子,并且cur是parent的左孩子,进行右单旋。
2.如果parent是grandparent的左孩子,并且cur是parent的右孩子,进行双旋。
· · · 旋转完以后的变色:将祖父和cur变成红色,父亲parent和叔叔uncle变成黑色,整棵树的根结点最后强制整成黑色。

情况二:叔叔不存在 或者 叔叔存在且为黑(LR/RL型,例如parent为左子树、cur为右子树)


旋转方式与AVL一致,请参考AVL树…
旋转后,就变成了情况二,按照情况二的方式调整即可。

红黑树的插入调整情况分析相关推荐

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

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

  2. HashMap红黑树原理及源码分析---图形、注释一应俱全

    目录 一.红黑树定义 二.节点新增原理: 三.红黑树的生成 2.1 一个节点 2.2 两个节点 2.3 三个节点 2.3.1 第二个节点作为root右子树情况下 2.3.2 第二个节点作为root左子 ...

  3. 红黑树的插入与验证——附图详解

    文章目录 红黑树 性质 红黑树的插入 前言 寻找插入位置 情况 1.0 情况 1.1 情况 1.2 情况 1.3 情况 2.0 情况 2.1 情况 2.2 情况 2.3 完整代码 红黑树的检验 验证代 ...

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

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

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

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

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

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

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

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

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

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

  9. 数据结构-----红黑树的插入操作

    红黑树是一棵二叉搜索树:树种每一个节点的颜色不是黑色就是红色.本篇中只实现用节点的颜色来描述红黑树,性质如下: RB1:根节点和所有外部节点都是黑色: RB2:在根至外部节点路径上,没有连续两个节点是 ...

最新文章

  1. linux mint 19 与windows时间不同步
  2. 云笔记项目-补充JS面向对象编程基础知识
  3. Centos7 install Openstack - (第三节)添加镜像服务(Glance)
  4. 完美解决IE8有两个进程的问题
  5. 主持人李咏在美国去世 妻子哈文:永失我爱
  6. 曲线运动与万有引力公式_高中物理曲线运动万有引力知识点
  7. qt_2_QT5.6+VS2015配置
  8. Centos下增加swap空间
  9. nginx配置错误导致的目录穿越漏洞
  10. 关于急救和医学常识,告诉我们你想知道什么?
  11. [基础]-requests模块使用详解
  12. Docker学习笔记(2)--Docker常用命令
  13. JavaScript中原型对象的彻底理解(转载)
  14. json中的loads和dumps的区别及用法
  15. idea中添加类、方法注释,快捷键设置
  16. 服务器装系统快吗,云服务器安装系统 快吗
  17. 分布式持久内存文件系统Octopus(ATC-17 )分析(四)
  18. 编译内核发现wireless_send_event未定义错误
  19. 通用查询实现方案(可用于DDD)[附源码] -- 简介
  20. 五子棋(基本+扩展)

热门文章

  1. 简单用spyder画函数图像
  2. 论文阅读:Data Platform for Machine Learning
  3. AI 浪淘沙 (week125-129)
  4. 论文编写中的图片导出问题
  5. 关于javaScript
  6. nd4j 向量_DL4J中文文档/ND4J/元素操作
  7. 【论文】RetinaNet
  8. uniapp监测网络uni.onNetworkStatusChange uni.getNetworkType的使用区别
  9. CF 327A - Flipping Game
  10. 视频教程-【吴刚】技术答疑与项目讲评视频教程(随时更新)-UI