来看234树的添加操作

添加如果出现需要分裂的情况,分裂出的元素首先进行和父级合并,如果父级已经是4节点那么将父级分裂,递归操作

234树的生长全部都是从叶子节点进行生长的,从叶子节点进行分裂向上延伸

红黑树

=======

性质

  1. 每个节点要么红色,要么黑色

  2. 根节点是黑色

  3. 每个子节点 (NIL) 是黑色

  4. 每个红色节点的两个子节点一定是黑色

  5. 任意一节点到每个叶子节点的路径都包含数量相同的黑节点

解释一下性质

性质4和性质5说一下

如果一个红色节点那么它的两个子节点必须为黑色,包括nil节点,也就是说不能有两个红色节点相连

任意一个叶子节点或没有子节点的节点到根节点经过的黑色节点数量都一致,不懂下面再解释

叶子节点 : 标记为NIL,为虚拟节点,颜色必须为黑色,234中叶子节点为没有子节点的节点,而红黑树的叶子节点是虚拟的节点

3节点的两种形态如果红色在左边就叫做左倾,红色在右边就叫做右倾

将234树进行转换为红黑树操作

右倾

左倾

现在来看一下几个没有子节点的节点下面其实都有两个NIL节点我们可以任意从一个nil节点出发,到6根节点,所经过的黑色节点个数是一样的,一般情况下NIL节点是不画出来的,但是不代表不存在

红黑树操作

=========

变色:节点的颜色由黑变红或者由红变黑

左旋:以某个节点作为旋转点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变。

右旋:以某个节点作为旋转点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变

看图!

右旋操作

左旋操作

![](https://img-blog.csdnim

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

g.cn/img_convert/713b7a1e77a90d345db79c306a11d476.gif)

新增节点

========

对比234树进行添加

红黑树所有添加的节点默认都为红色

1 添加一个根节点

添加第一个默认为红色的节点,发现与红黑树性质"根节点必须为黑色"冲突,我们将5变色为黑色即可,完成添加操作

2 添加一个节点,与2节点合并

3 添加一个节点,与3节点合并

根据234树转红黑树的两种状态导致添加时可能会出现两个红色节点相连的情况

左倾通过旋转和变色可以变成右倾的状态,反之亦然

4 添加一个节点和4节点合并

我们回到3和4,其中有需要调整的树

对于3里面的两种情况,看234树和红黑树的对比,4节点的红黑树形态是上面黑色节点左右两边各一个红色节点,而现在是三个元素一条线,上面黑色节点,下面两个红色,我们已经知道它的最终形态是什么样子,只需要进行调整即可

而对于上面的添加还有一种情况需要旋转两次,解决思路就是变换为上面的情况,然后按照上面的步骤完成

而4里面的情况,进行变色即可

如果经过变色爷爷节点变色为红色,假设不是根节点的话,与上面的其他节点发生冲突,我们把变色的爷爷节点当做新增的节点进行操作

如果爷爷节点的父亲节点和叔叔节点都为红色则继续按照上面的操作进行调整,如果叔叔节点不是红色则需要进行其他调整

例如下图,如果4的叔叔节点为红色,那么直接根节点变黑(先变红发现是根节点然后变黑)即可,如果叔叔节点为黑色,那么就需要进行旋转变色操作

红黑树在线演示网站

删除节点

========

前驱节点和后继节点

删除一个节点肯定有人要替代被删除节点的位置,可以选择前驱节点或后继节点

前驱节点 : 小于当前节点的最大节点

后继节点 : 大于当前节点的最小节点

例如 下面图的6节点,前驱节点就是5,后继节点就是9

除非左子树或右子树只有一个节点

寻找前驱节点就是寻找左子树的第一个节点的右儿子,一直往右找直到找到没有右子节点的节点

寻找后驱节点就是寻找右子树的第一个节点的左儿子,一直往左找直到找到没有左子节点的节点

删除一个节点可以理解为删除它的替换节点

为什么这么说呢,如果使用代码实现红黑树,一个节点至少有3个指针,左孩子指针,右孩子指针,父亲指针,节点中假设就存储一个值,那么移除原来的节点替换为新的节点需要移动:左右孩子指针,父指针,替换的左右孩子指针,左右孩子的父指针…

而我们将替换的节点的值赋值给需要删除的节点,还是上面那个图,假如我们删除10,使用后继节点11来替代,我们只需要将11的值赋值给10,然后删除11节点即可,也就是说只需要修改两个指针,11的父指针和12的左孩子指针即可完成

而在234树中,删除的永远都是叶子节点,可以看上面的图,前驱节点和后继节点用于都是在最底层

那么我们删除的情况从是否有孩子来看就只有两种

  1. 删除没有孩子的节点

  2. 删除有一个孩子的节点

为什么没有2个孩子的情况呢?如果删除一个节点来寻找它的替换节点,那么要么是前驱或后继,而这两个节点的条件是一直寻找左边孩子或右边孩子,如果一个节点有两个孩子,那么它肯定不是一个前驱或后继节点

后继节点同理,如果一个前驱节点或后继节点有两个子节点,那么它一定不是前驱节点或后继节点

前驱或后继节点从叶子节点开始的层数不会大于2

那还有个疑问,会不会出现下面这种情况,10的后继节点12这都3层了,不是说不会大于2吗

这种情况存在吗?现在都知道红黑树是234树转换来的,那么234树中会出现一个节点只有一个孩子的情况吗?

234树的生长都是从叶子节点进行分裂的,也就是说除了叶子节点,就是说最少的子节点也就是两个,最多4个,不可能出现上图的情况,两个子节点的节点为2-节点,2节点除了第一次添加为根节点或叶子节点以外,任何2-节点都会连接两个子节点,而两个子节点肯定是2,3,4节点其中之一,转换红黑树不可能出现上图情况,可以回去看看234树转换红黑树对应图

那么下面开始进行删除

先在234树上进行删除

可以直接进行删除的有4,11,13,其中4和5比较特殊,如果进行的是右倾操作,那么可以直接删除5

在234树删除操作中3-节点和4-节点是可以自己搞定的,例如删除4或5, 11或12或13,随便删除一个都不影响234树的性质

而在红黑树中删除只能删除234树对应的3-节点和4节点中红色节点,这几个节点可以直接删除,不需要任何额外操作

在红黑树中删除5只需要将4替换掉5,然后进行变色即可,红黑树的性质依然保持

删除

情况1,自己能搞定,对应234树当前要的删除3-节点或4-节点

  1. 叶子节点例如是234树中的红色叶子节点或红黑树中没有子节点的红色节点直接删除例如上图的红黑树中4,11,13节点,可以直接删除

  2. 有一个子节点使用子节点来替代,如果需要进行变色例如上图的红黑树中5节点,删除后4节点替代自己,然后变黑色,而12节点可以找左儿子或右儿子都可以替换自己

情况2 自己搞不定,需要兄弟节点和父亲节点帮忙

兄弟节点为3-节点的情况

例如现在想要删除5,这时候就需要兄弟节点和父节点帮忙

首先将5删除,之后需要从兄弟节点拿来一个节点来弥补空缺,但是兄弟节点都比6大,如果直接放入无论是234树还是红黑树都会违反性质,234 : 3-节点的左子树元素全部小于key1 ,红黑树: 任何一个节点左边都是小于当前节点

这时我们把父亲节点用来弥补删除的空缺

之后兄弟节点去弥补父节点的空缺

字节三面:小伙子你先跟我说一说红黑树吧,java程序设计教程雍俊海第三版答案相关推荐

  1. Java雍俊海第三版7.3答案

    编写一次程序.在控制台窗口中提示输入两个整数,然后接收这两个整数,并求出他们的和.下面是运行过程的示例: 请输入第一个整数:45 请输入第二个整数:23 计算结果:45+23=68 上面两个黑斜体整数 ...

  2. Java程序设计(2021春)——第三章类的重用笔记与思考

    Java程序设计(2021春)--第三章类的重用笔记与思考 本章概览: 3.1 类的继承(概念与语法) 3.2 Object类(在Java继承最顶层的类) 3.3 终结类和终结方法(只能拿来用,不可以 ...

  3. 80X86汇编语言程序设计教程(杨季文)习题答案三

    第三章: Tarzan版 题3.1  伪指令语句与指令语句的本质区别是什么?伪指令的主要作用是什么? 答:   伪指令语句与指令语句的本质区别是指令语句有其对应的机器指令,而伪指令没有:        ...

  4. Java程序设计教程——第三章习题

    1.简述面向对象的编程的特性和优势. 与现实世界相对应,使现实世界的人可以通过观察现实世界来编程,相比以结构化编程方法,面象对象方法更符合人的逻辑方法:同时在开发大的项目时,面象对象编程方法更符合工程 ...

  5. java程序设计教程第三版雍俊海

    前言 其实前几篇文章已经写了好多有关于Spring源码的文章,事实上,很多同学虽然一直在跟着阅读.学习这些Spring的源码教程,但是一直都很迷茫,这些Spring的源码学习,似乎只是为了面试吹逼用, ...

  6. Java程序设计——Swing UI 高级组件(三)

    目录 Timer:计时器 JFileChooser:文件选择器 JColorChooser:颜色选择器 BorderFactory:边框 JTable:表格 JOptionPane:标准对话框 JTr ...

  7. Java程序设计教程(第三版) 雍俊海 7.3 答案/代码

    哎,为了期末考试,每个都试了一下,也不知道对不对... 题目: 编写一个程序.要求输入5个学生的成绩(从0到100的整数),并将这5个数保存到文件"data.txt" 中. 然后再 ...

  8. 【JAVA程序设计教程 第三版 雍俊海】8.8 编写多文档文本编辑器

    题目: 请编写一个简单的多文档文本编辑器.要求可以输入文件名,从指定文件中读取数据,并显示在图形界面上.可以编辑显示在图形界面上的数据,而且可以将显示在图形界面上数据写入指定文件中. 思路: ①:首先 ...

  9. 2018-2019-2 20175227张雪莹《Java程序设计》实验三 《敏捷开发与XP实践》

    2018-2019-2 20175227张雪莹<Java程序设计> 实验三 <敏捷开发与XP实践> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号: ...

最新文章

  1. 如何用数学追到完美情人?
  2. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...
  3. java 定义一个未知长度数组
  4. angular 代码高亮_angular 搜索/查找关键字高亮
  5. [Eclipse]GEF入门系列(序)
  6. python二维数组排序_Python实现二维数组按照某行或列排序的方法【numpy lexsort】...
  7. 作者:黎建辉(1973-),男,博士,中国科学院计算机网络信息中心研究员、博士生导师。...
  8. ubuntu vim配置所有用户生效
  9. mysql集群之keepalived简单搭建
  10. 中的工程图怎样才能做成正规图纸_新一代一拖二口罩机图纸详细设计三维模型带工程图...
  11. 2021-08-08 事务的提交,回滚
  12. java 处理时间的类_详解JAVA 时间处理相关类
  13. yacc 简易计算机规则,YACC 使用说明——计算器实例.pdf
  14. 怎么让图片铺满手机屏幕_手机版Photoshop怎么把图片铺满屏幕?
  15. 大学生如何培育计算机思维,计算机思维下的计算机课程改革思路探索
  16. android edittext 手机号码,Android Edittext 手机号码格式输入设置
  17. 2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真
  18. Handler原理讲解及源码分析
  19. E. New Game Plus!(Technocup 2021 - Elimination Round 2)
  20. 电池_电池容量的测试——手机、电池、充电器三件套之电池篇3

热门文章

  1. Fuzzy C-Means Clustering(模糊C均值)
  2. 会计学考计算机二级哪些科有用,计算机二级考哪个科目比较好?
  3. 计算机研究生博士课程设置,计算机科学与技术学科博士研究生培养方案.doc
  4. 微信 html5 识别手写签名,html5 canvas做手写签名,该如何解决
  5. 计算机科学体系介绍,计算机学科体系简介.ppt
  6. SAI柔顺量多的长发简单画法
  7. 南京三日游攻略!学生党请入!!
  8. python3+服务器+微信公众号的聊天机器人
  9. C++【二叉搜索树】
  10. Python和R哪个更适合机器学习?两者结合,双倍快乐