字节三面:小伙子你先跟我说一说红黑树吧,2024年最新面试必备经典词汇-程序员宅基地

技术标签: 程序员  面试  职场和发展  

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

新增节点

========

对比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 ,红黑树: 任何一个节点左边都是小于当前节点

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

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

那么回到红黑树呢?

为什么会出现这种情况呢?我们回想一下234树转换红黑树的图,在234树中一个3-节点可能出现左倾或右倾的情况

上面是6在上面10在下面的情况,我们换成相反的情况来看看

这时5的兄弟节点就和234树中的一样了,234树的3-节点转换为红黑树的两种情况都可以通过左旋变色或右旋变色进行变化

例如上图,我们6和8节点进行右旋,就会变成上面第二张图,而上面的第二张图6节点和8节点进行左旋又会变成上面的这张图

有没有发现一个问题呢,当红黑树5节点的兄弟节点为黑色时也就是说明它的兄弟节点和234树中5节点的兄弟节点一致

也就是说如果它的兄弟节点为红色,需要先进行旋转变色才能进行删除,而6和8变色在234树上等于没动,因为234树根本就没有颜色,只是为了方便对比红黑树添加的颜色

上面的图还有一种情况,就是3-节点7和9位置反的,9在上面7在下面,而替代需要兄弟节点中最小的元素来替代,如果出现这种情况需要先将7和9进行旋转换色,成为上面的情况,然后再进行替换

再来看兄弟节点为4-节点的情况

还是删除5节点,离它最近的兄弟节点是个4-节点

兄弟节点为4-节点的删除

只画需要修改的地方,先来看234树

写在最后

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。

复习一周,字节跳动三场技术面+HR面,不小心拿了offer

复习一周,字节跳动三场技术面+HR面,不小心拿了offer

上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
链图片转存中…(img-lbd4UHx2-1713118680486)]

[外链图片转存中…(img-iiHxWkR4-1713118680487)]

上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-ePQ4aY4I-1713118680487)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_83977569/article/details/137760537

智能推荐

MATLAB的GUI 程序设计_制作一个曲面光照效果的演示界面,如图所示,三个弹出式菜单分别用于选择曲面形式、-程序员宅基地

文章浏览阅读7.2k次,点赞7次,收藏60次。第七章 MATLAB的GUI 程序设计Chapter 8: Design of MATLAB of GUI programGUI(Graphical User Interfaces):由各种图形对象组成的用户界面,在这种用户界面下,用户的命令和对程序的控制是通过“选择”各种图形对象来实现的。目前90%以上的应用程序和软件都是在GUI下运行的。MATLAB有两种GUI用户界面控件的创建方式,基于命令行的方式用程序来制作和基于GUI的方式制作。这里主要介绍基于GUI的方式。MATLAB 的._制作一个曲面光照效果的演示界面,如图所示,三个弹出式菜单分别用于选择曲面形式、

MT7628开发环境搭建_undefined reference to `llseek-程序员宅基地

文章浏览阅读2.1k次。参考openwrt 快速入门1.环境搭建1.1Ubuntu dockerhttps://www.runoob.com/docker/ubuntu-docker-install.html​1.1.1使用官方安装脚本自动安装安装命令如下:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun​ps: 我已经放弃用deepin编译旧版openwrt ,修复了十几个bug还是有bug,无敌下载14.04版本docke_undefined reference to `llseek

13 Kubectl命令概览_kube_ps1关闭-程序员宅基地

文章浏览阅读81次。kubectx:用于切换kubernetes context kube-ps1:为命令行终端增加$PROMPT字段 kube-shell:交互式带命令提示的kubectl终端kube-shell开源项目kube-shell可以为kubectl提供自动的命令提示和补全,使用起来特别方便,推荐给大家。Kube-shell有以下特性:命令提示,给出命令的使用说明 自动补全,列出可选命令并可以通过tab键自动补全,支持模糊搜索 高亮 使用tab键可以列出可选的对象 vim模式M..._kube_ps1关闭

ensp各种报错积累(以及解决方法)_ensp配置路由地址时错误-程序员宅基地

文章浏览阅读1k次,点赞11次,收藏9次。此报错的意思是请续订默认配置,就是让你去一级一级的删除,首先删除你设置的允许vlan通过的命令,然后去取消掉更改的端口类型命令(就是在配置命令前面加一个undo),再去更改端口类型就成功了。此报错的意思是已经加入了接口,不能在修改模式,所以需要先去把端口全部删除,在修改模式即可成功。他的意思就是说这个IP地址已经配置了,不需要在配置了。2.修改链路聚合模式的时候。3.更改IP地址的时候。_ensp配置路由地址时错误

经典JS-序列号_ucfp:74a28a8b-b3fb-4602-ca5f-0ebdf880c1ff-16927960-程序员宅基地

文章浏览阅读10w+次。3D0E1D4E75686FA0FF1C6F6F626F6F6F6F6F6F6F8F381B2FFF2D6FEF396F6F6A1B6E6F6D762B39E3021B282C725C726F4F6F6F6F5F5F5C330E1F06251C335B5E0D580E5E095D575B0E56560B5F0B41051C6F9F4FCC60636EBE7FBE7A3E637EB613394327_ucfp:74a28a8b-b3fb-4602-ca5f-0ebdf880c1ff-1692796091560

Linux下使用crontab定时任务进行Tomcat日志分割_crontab多个任务如何分割-程序员宅基地

文章浏览阅读722次。Linux下使用crontab定时任务进行Tomcat日志分割_crontab多个任务如何分割

随便推点

vue把字符串分割成等长的若干字符串,根据特定字符分割字符串_vue 分割字符串-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏20次。把字符串分割成等长的若干字符串,根据特定字符分割字符串_vue 分割字符串

朴素贝叶斯分类器的例子_朴素贝叶斯分类器 例子-程序员宅基地

文章浏览阅读1.1k次。一、病人分类的例子让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难。某个医院早上收了六个门诊病人,如下表。  症状  职业   疾病  打喷嚏 护士   感冒   打喷嚏 农夫   过敏   头痛  建筑工人 脑震荡   头痛  建筑工人 感冒   打喷嚏 教师   感冒   头痛  教师   脑震荡现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?根据贝叶斯..._朴素贝叶斯分类器 例子

当mysql数据库转换为sqlserver数据库时常见报错_mysql 数据导出在sqlserver不能用-程序员宅基地

文章浏览阅读527次。↵下面是我在把mysql数据库转换为sqlserver数据库时候遇到过的一些错,踩过的坑,把它总结下来防止以后再出错。报错 1:com.microsoft.sqlserver.jdbc.SQLServerException: 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'user_student'中的标识列指定显式值。出错原因:当mysql数据库转换为sqlserver数据库时,如果第一个id设置为自动递增,那么String sql = "..._mysql 数据导出在sqlserver不能用

LeetCode 刷题常用数据结构(Java 中的实现)_javalist集合map组合刷题 leetcode-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏27次。记录常用数据结构(栈、队列、数组、列表、字符串、集合等),在 Java 中如何使用它的实现类。_javalist集合map组合刷题 leetcode

Visual Studio Code 设置成中文_visualstudiocode中文-程序员宅基地

文章浏览阅读6.7k次,点赞5次,收藏4次。Visual Studio Code 编辑器设置成中文 分2个步骤1、【查看】--【扩展】(Ctrl+Shift+X) 在扩展:商店中输入Chinese,搜索到 适用于 VS Code 的中文(简体)语言包,点击安装; 2、Ctrl+Shift+P,调出搜索框,输入 Configure Display Language,选中此配置项; 把配置页面中的"..._visualstudiocode中文

[TypeScript][JavaScript]数组遍历方法总结_typescript 数组遍历-程序员宅基地

文章浏览阅读1.2k次。本文整理自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array对比every(),some(),includes(),indexOf(),lastIndexOf(),find(),findIndex(),forEach(),map(),filter(),fill()..._typescript 数组遍历

推荐文章

热门文章

相关标签