java面试-彻底搞懂红黑树

简介: 红黑树性质1、每个结点或是红色的,或是黑色的 2、根节点是黑色的 3、每个叶结点(NIL)是黑色的 4、如果一个节点是红色的,则它的两个儿子都是黑色的。

红黑树性质

1、每个结点或是红色的,或是黑色的 
2、根节点是黑色的 
3、每个叶结点(NIL)是黑色的 
4、如果一个节点是红色的,则它的两个儿子都是黑色的。 
5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。

和AVL树的比较

AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。

红黑树用非严格的平衡来降低插入删除时旋转的次数。

因此,如果你的业务中查找远远多于插入、删除,那选AVL树; 
如果查找、插入、删除频率差不多,那么选择红黑树。

插入过程

默认插入的结点为红色。为何? 
因为红黑树中黑节点至少是红节点的两倍,因此插入节点的父节点为黑色的概率较大,而此时并不需要作任何调整,因此效率较高。

1. 父为黑

title 
插入后无需任何操作。由于黑节点个数至少为红节点的两倍,因此父为黑的情况较多,而这种情况在插入后无需任何调整,这就是红黑树比AVL树插入效率高的原因!

2. 父为红

父为红的情况破坏了红黑树的性质,此时需要根据叔叔的颜色来做不同的处理。 
title

  1. 叔叔为红 
    title 
    此时很简单,只需交换爸爸、叔叔和爷爷的颜色即可。 
    此时若爷爷节点和太爷爷节点颜色相同,再以爷爷节点为起始节点,进行刚才相同的操作,即:根据爷爷的兄弟颜色做相应的操作。

  2. 叔叔为黑 
    此时较为复杂,分如下四种情况: 
    a)爸爸在左、叔叔在右、我在左 
    title 
    以爸爸为根节点,进行一次R旋转。 
    b)爸爸在左、叔叔在右、我在右 
    title 
    title 
    先以我为根节点,进行一次L旋转; 
    再以我为根节点,进行一次R旋转。 
    c)叔叔在左、爸爸在右、我在左 
    title 
    先以我为根节点,进行一次R旋转; 
    再以我为根节点,进行一次L旋转。 
    d)叔叔在左、爸爸在右、我在右 
    title 
    以爸爸为根节点,进行一次L旋转。


删除过程

二叉搜索树的删除

若删除二叉搜索树的节点A,实际上删除的是二叉搜索树中序遍历的前驱节点,注意: 
1. 这个被删除节点要么就是一个叶子节点, 
2. 要么有且仅有一个左孩子 
然后将孩子顶替它原来的位置,最后将被删的节点值覆盖待删除的那个节点A。

红黑树按照二叉搜索树的方式删除节点,之后再进行相应的旋转操作,使得删除后的树仍然是一棵红黑树。

定义

  1. 待删除节点:要删除的那个节点
  2. 实际删除节点:待删除节点的中序遍历前驱

红黑树实际删除节点的性质

  1. 实际删除节点要么是叶子节点,要么有且仅有一个左孩子;
  2. 若为叶子节点,必为红色;
  3. 若实际删除节点还有孩子,则该必为左孩子; 
    a)若左孩子为红色,则实际删除节点必为黑色; 
    b)若左孩子为黑色,则实际删除节点红黑均可以。

约定

  1. 蓝色箭头:表示判定点
  2. 在删除操作开始前,蓝色箭头首先指向实际删除节点。
  3. 『实际删除节点』在图中以『父』表示。

旋转过程开始:

1. 父为红色(待删节点为叶子)

直接删除父节点即可: 
title


2. 父为黑 子为红(待删节点为黑、待删节点子节点为红+左孩子)

用子节点覆盖父节点,并保持父节点的颜色: 
title


3. 父为黑 子为黑(待删节点和子节点均为黑)

3.1. 叔叔为红

PS:叔叔为红,则爷爷必为黑!

  1. 父在左 叔在右 
    a)子节点覆盖父节点 
    b)进行一次左旋 
    title

  2. 父在右 叔在左 
    a)子节点覆盖父节点 
    b)进行一次右旋


3.2. 叔叔为黑

PS:叔叔、爸爸都为黑,那爷爷颜色就不确定了!

  1. 祖父红 两个侄子黑 
    以下两种情况操作一致: 
    1.子覆盖父(删除) 
    2.交换祖父和叔叔的颜色。

    a)父在左 叔在右 
    title 
    b)父在右 叔在左 
    同上。

  2. 祖父黑 两个侄子黑 
    以下两种情况操作一致: 
    1. 祖父染成子节点的颜色; 
    2. 子节点染成黑色; 
    3. 叔叔染成红色 
    a)父在左 叔在右 
    title 
    b)父在右 叔在左

  3. 祖父颜色随意 至少有一个红侄 
    a)红侄为左左(叔左、红侄左) 
    1. 红侄进行一次右旋 
    2. 红侄染成黑色 
    3. 交换叔叔和祖父的颜色 
    title 
    b)红侄为左右(叔左、红侄右) 
    1. 红侄进行一次右旋+左旋 
    2. 红侄染成父节点颜色; 
    3. 父节点染成黑色 
    title 
    c)红侄为右左(叔右、红侄左) 
    1. 红侄进行一次右旋+左旋 
    2. 红侄染成父节点颜色; 
    3. 父节点染成黑色; 
    title 
    d)红侄为右右(叔右、红侄右) 
    1. 红侄进行一次左旋 
    2. 叔叔染成父节点颜色; 
    3. 红侄染成黑色; 
    title

相关文章
|
4月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
7月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
401 1
|
6月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
521 0
|
6月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
289 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
4月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
7月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
210 5
|
7月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
352 1
|
6月前
|
缓存 Java 关系型数据库
Java 面试经验总结与最新 BAT 面试资料整理含核心考点的 Java 面试经验及最新 BAT 面试资料
本文汇总了Java面试经验与BAT等大厂常见面试考点,涵盖心态准备、简历优化、面试技巧及Java基础、多线程、JVM、数据库、框架等核心技术点,并附实际代码示例,助力高效备战Java面试。
229 0
|
6月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
329 0