我是猿人,一个热爱技术、热爱编程的IT猿。技术是开源的,知识是共享的!
写作是对自己学习的总结和记录,如果您对 Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣,可以关注我的动态,我们一起学习,一起成长!
用知识改变命运,让家人过上更好的生活,互联网人一家亲!
---公众号「猿码天地」
Java知识学堂:https://gitee.com/zhangbw666/it-knowledge
你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。——《写给程序员朋友》
作者 | DeusJin
来源 | urlify.cn/VZvqI3
[猿码天地-Java知识学堂脑图 (文件密码:请关注公众号【猿码天地】,回复关键字‘活到老学到老’获取)](https://www.processon.com/view/link/6035ed1f079129248a64a6af)
[猿码天地-Java超神之路脑图 (文件密码:请关注公众号【猿码天地】,回复关键字‘活到老学到老’获取)](https://www.processon.com/view/link/6035f068e0b34d124437e0e1)
红黑树基于二叉查找树的附加特性
-
节点是红色或黑色。
-
根节点是黑色。
-
每个叶子节点都是黑色的空节点(叶子结点指为空的叶子结点)。
-
每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不能有两个连续的红色节点)。
-
从任意节点到其每个叶子的所有路径都包含相同数目的黑色节点。
1. 数据结构
class TreeNode{
private Boolean color;
private int val;
private TreeNode left;
private TreeNode right;
private TreeNode parent;
get,set...
}
class RBTree{
public boolean add(int val){...}
public boolean delete(int val){...}
public void display(){...}
}
2. 左旋以及右旋
2.1 左旋
2.2 右旋
3. 插入
-
新插入的节点(newNode)为红色。
-
按照二分查找树插入规则插入。
-
分情况讨论(以下情况基本都是为了保持上文所讲的的红黑树特性4和特5)
1、若newNode为根节点,则变为黑色,插入完毕,返回 true。
2、若newNode父节点为黑色,则插入完毕,返回 true。
3、如下图所示,若newNode父节点为红色,且叔叔节点存在且为红色,则父节点与叔叔节点变为黑色,祖父节点变为红色,newNode = 祖父节点。
4、如下图所示,若newNode父节点为红色,叔叔节点不存在或为黑色,且newNode为父节点右孩子,父节点为祖父节点左孩子,则以父节点为轴左旋,进入情况6.
5、如下图所示,若newNode父节点为红色,叔叔节点不存在或为黑色,且newNode为父节点左孩子,父节点为祖父节点右孩子,则以父节点为轴右旋,进入情况7
6、如下图,此时以祖父节点为轴进行右旋,将祖父节点变为红色,newNode变为黑色。
7、如下图,此时以祖父节点为轴进行左旋,将祖父节点变为红色,newNode变为黑色。
4. 删除
分情况讨论(和插入一样,以下情况基本都是为了保持上文所讲的的红黑树特性4和特5)
-
如下图,如果待删除节点B有两个非空的孩子节点,转化成待删除节点只有右孩子(或没有孩子)的情况,习惯性选取待删除节点右子树最小节点E替换待删除节点(只是值替换,颜色不变),并将待删除节点变为E。
-
根据待删除节点和唯一子节点颜色,分情况处理:
-
自身O是红色,子节点N是黑色,直接删除。
-
自身O是黑色,子节点N是红色,直接删除并将子节点N变为黑色。
-
自身O是黑色,子节点N不存在(不存在即子节点为空黑色节点,也可以用来判断)或也是黑色,较为复杂,先删除,再分情况讨论:
1、N是根节点,则不需要调整。
2、如下图,N的父亲、兄弟、侄子都是黑色,则将兄弟变为红色,父亲视作N,进行递归处理。
-
3、(存在镜像)N的兄弟节点是红色,且N为父亲节点左儿子,则以父亲节点为轴左旋(否则右旋),并将旋转后N的祖父节点变为黑色,N的父节点变为红色,进入情况4,5或6.
4、N的父亲节点是红色,兄弟和侄子节点是黑色,父亲节点变为黑色,兄弟节点变为红色。
5、(存在镜像)N的父节点颜色随意,兄弟节点为父节点黑色右孩子,左侄子节点为红色,右侄子节点为黑色,以兄弟节点为轴进行右旋,将旋转后N的兄弟节点变为黑色,N的右侄子节点变为红色,进入情况6
6、(存在镜像)N的父节点随意,兄弟节点为父节点的黑色右儿子,右侄子节点为红色,以N的父节点为轴进行左旋,左旋后的N的祖父节点变为父节点颜色,父节点变黑,叔叔节点变黑。
测试
原树(上右下左)
删除53
删除23
删除54
添加67
代码
https://github.com/DEUSJIN/RBTree
福利一:月薪3万Java优秀简历模板
简历是对你过往学习和工作的一个总结,一份好的简历容易给人留下深刻印象,更容易被企业发现,创造更多的就业机会。优秀的简历可以把你推销给优秀的企业,看看别人的优秀简历范文,让自己的简历更加优秀吧。
可以在微信搜索
「猿码天地」
,关注后回复关键字「简历」
即可获取!
福利二:全网最全一线大厂Java笔试面试题
面试题涵盖了Spring核心知识、SpringMVC、SpirngBoot、SpringCloud、JVM、数据库、常用消息组件Kafka、RabbitMQ、分布式、微服务组件Eureka、Ribbon、Config、Feign、Nacos、Zookeeper等、SQL优化、常用服务器Tomcat、Nginx、多线程、高并发等等。
可以在微信搜索「猿码天地」,关注后回复关键字「BAT面试」即可获取!
福利三:1000+本Java开发精华电子书
猿人从事Java开发多年,从最初的小白,一步步通过自己不断的学习、摸索,终于走上了码农这条没有回头的路。学习是无止境的,有时零零散散的学习资料难以将我们的知识成体系的串联起来。为此,为了让大家在学习Java的道路上成系统的学习,少走弯路,猿人为大家整理了1000+本Java开发精华电子书,毕竟现在电子书也是挺贵的,哈哈,希望能给大家带来帮助。
电子书涵盖:Java入门、并发编程、底层、常用框架、性能优化、设计模式、工具、计算机网络、操作系统、数据库、数据结构与算法、大数据、架构设计、Linux知识、面试、扩展、管理、容器化技术、云计算、微服务、领域设计等方方面面,猿人还会给持续更新。
获取方式
第一种:微信搜索「猿码天地」或者扫描下面的二维码,关注后回复关键字「电子书」即可获取!
第二种:Gitee:https://gitee.com/zhangbw666/java-books
希望程序员朋友能认真学习,根据自身需要获取对应的电子书,学习是永无止境的。
你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。 ——《写给程序员朋友》