JDK底层应用最多的 红黑树

红黑树

学习红黑树 之前必须懂二分查找、数据结构中的二叉树、二叉搜索树、平衡二叉树等概念
我在 数据结构与算法——Java落地(考研求职必学)一文中 给出了这些理论多地的java代码下载地址、大家可以自行查阅。

为什么会出现红黑树?

问题: 二叉搜索树可以极大的提高我们的搜索效率,但是他的在插入的时候受第一个值的限制很可能插入多个节点后变成单链表。
解决: AVL树 也就是平衡二叉树 ,它的左右子树高度之差的绝对值不超过1,这样确实可以避免一条直线,但人们认为最理想的状态,还是红黑树

红黑树的性质 (重点)

  1. 每个节点不是红色就是黑色
  2. 不可能有连在一起的红色节点
  3. 根节点都是黑色
  4. 每个红色结点的两个子节点都是黑色的,叶子节点都是黑色的
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树的构建

  1. 改变颜色 最简单 红变黑 黑变红
  2. 左旋 针对点悬,但是点上边的子树也要跟着转,指针
  3. 右旋
旋转和颜色变换规则
  1. 改变颜色的情况:
    当前结点的父亲是红色,且它的祖父结点的另一个子节点也是红色。(叔叔结点):
    (1)把父节点设为黑色
    (2)把叔叔也设为黑色
    (3)把祖父点设为红色
    (4)把指针定义到祖父节点设置为当前要操作的
  2. 左旋:当前父节点是红色,叔叔是黑色的时候,且当前的节点是右子树,左旋
    以父节点作为左旋
  3. 右旋:当前父节点是红色,叔叔是黑色的时候,且当前的节点是左子树,右旋
    (1)把父节点设为黑色
    (2)把祖父点设为红色
    (3)以祖父节点旋转 TreeMap JDK 1.8
    红黑树

红黑树与AVL树区别

红黑树的特质:

从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。

平衡二叉树的特质:

它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

区别:

1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。

2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

### 不同类型树结构的特点及应用场景 #### 二叉树 二叉树是一种基础的数据结构,其中每个节点最多有两个子节点。这种简单的定义使得二叉树可以有种形态,从完全不平衡的状态到接近满二叉树的形式。 对于普通的二叉树而言,并无特定顺序约束其元素排列方式[^5]。因此,在最坏情况下执行查找、插入或删除操作可能需要遍历几乎整个树形结构,这导致性能低下。 #### 红黑树 作为一种自平衡的二叉搜索树,红黑树通过引入颜色标记来维持一定的平衡特性,从而保证任何路径上黑色结点数目相同。此机制有助于保持较低的最大高度,进而提高各种操作的速度效率。 具体来说,相比于其他形式更严格的AVL树,红黑树允许一定程度上的倾斜存在,但在实际应用中仍能提供较好的时间复杂度表现——O(log n),适用于频繁更新场景下的快速检索需求,比如Linux内核里的进程调度器以及Java集合框架内的`TreeMap`和`TreeSet`类均采用了此类算法实现高效管理键值对关系[^4]。 ```java // Java TreeMap 使用红黑树作为底层实现的一个例子 import java.util.TreeMap; public class Example { public static void main(String[] args) { TreeMap<Integer, String> map = new TreeMap<>(); map.put(10, "Ten"); System.out.println(map.containsKey(10)); // 输出 true } } ``` #### B树 B树设计之初旨在解决磁盘I/O瓶颈问题,特别适合存储于外部介质的大规模数据集索引构建。它具有如下几个显著特征: - 高度相对较小,减少了访问外存次数以提升整体读写效能。 这些属性共同作用下,即使面对海量记录也能确保较高的查询速度与稳定性[^2]。 #### B+树 基于传统B树进一步优化而来的B+树,主要改进体现在两个方面:一是仅将实际数据项集中放置于末端叶级位置;二是相邻叶子间建立了双向循环链表连接以便范围扫描时更加便捷高效。这样的改动不仅简化了维护工作同时也增强了针对连续区间定位的能力,广泛应用于各类大型数据库管理系统当中充当核心组件之一负责处理复杂的事务逻辑[^1]。 | 特征/类型 | 二叉树 | 红黑树 | B树 | B+树 | | --- | --- | --- | --- | --- | | 平衡性 | 可能严重失衡 | 自动调整至近似平衡状态 | 维持严格层次化分布 | 类似B树但有所增强 | | 数据存放位置 | 节点任意处 | 关键字有序排列 | 内部节点含部分信息 | 唯一存在于叶子级别 | | 应用实例 | 极少单独使用 | Linux进程调度、JDK容器 | 文件系统元数据索引 | MySQL InnoDB引擎 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值