认识红黑树,解决二叉树删除后遗症 | 带你学《Java语言高级特性》之四十一

简介: 在上一节的学习中不难发现,二叉树节点增减后,其结构可能会发生左右子树不平衡的问题,导致其查找效率大打折扣。本节将为读者介绍红黑树的概念及其对于二叉树来说增加的内容与节点规则。

上一篇:浅谈二叉树节点删除之道 | 带你学《Java语言高级特性》之四十

在上一节的学习中不难发现,二叉树节点增减后,其结构可能会发生左右子树不平衡的问题,导致其查找效率大打折扣。本节将为读者介绍红黑树的概念及其对于二叉树来说增加的内容与节点规则。

【本节目标】
通过阅读本节内容,你将进一步认识二叉树,对其简单的节点增减工作带来的“后遗症”有一个明确的认识,了解到红黑树的基本概念与其节点结构的特点,初步理解其能够实现二叉树的调整平衡的方法。

红黑树原理分析

通过整个二叉树的实现相信已经可以清楚二叉树的主要特点:数据查询的时候可以提供更好的查询性能,但是这种原始的二叉树结构是有明显缺陷的,例如,当二叉树结构改变的时候(增加或删除)就有可能出现不平衡的问题。

image.png
传统二叉树问题

之前所谓的解决二叉树性能问题的方式最终全部都变为了null,也就是说如果要想要达到最良好效果的二叉树,那么它首先是一个平衡二叉树,同时所有节点的层次深度都应该相同。

image.png
均衡二叉树

如果所有的数据按照以上的结构进行保存,那么二叉树的检索操作执行效率一定是最高的,可是树就需要忍受住频繁的增加或者是删除操作,所以针对于二叉树有了进一步的要求。

红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则。这些规则使红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为“O(logn)”。
红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被Leo J.Guibas和Robert Sedgewick修改为如今的“红黑树”。

红黑树的本质就是在节点上追加了一个表示颜色的操作信息而已。

enum Color{
    RED,BLACK;
}
class BinaryTree<T> {
     private class Node {
          private T data;
          private Node parent;//父节点
          private Node left;//左子树
          private Node right;//右子树
          private Color color;//节点颜色
     }
}
class BinaryTree<T> {
     private class Node {
          private T data;
          private Node parent;//父节点
          private Node left;//左子树
          private Node right;//右子树
          private boolean color;//节点颜色
     }
}

对于Node节点中的颜色标记可以使用true或false来实现,不一定非要使用枚举类。
一个标准的红黑树的结构如下所示:

image.png
红黑树基本结构

红黑树特点(规则)
1、每个节点或者是黑色,或者是红色;
2、根节点必须是黑色;
3、每个叶子节点是黑色;
  |- Java实现的红黑树将使用null来代表空节点,因此遍历红黑树时将看不到黑色的叶子节点,反而看到每个叶子节点都是红色的;
4、如果一个节点时红色的,则它的子节点必须是黑色的;
  |- 从每个根到节点的路径上不会有两个连续的红色节点,但黑色节点是可以连续的。若给定黑色节点的个数N,最短路径情况是连续的N个黑色,树的高度为N-1;最长路径的情况为节点红黑相间,树的高度为2(N-1);
5、从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点数量;
  |- 成为红黑树最主要的条件,后序的插入、删除操作都是为了遵守这个规定;

红色节点之后绝对不可能是红色节点,但是没有说黑色节点之后不允许是黑色节点,允许黑-黑连接。

主要是利用红色节点与黑色节点实现均衡控制。简单点理解红黑树的结构就是为了可以进行左旋和右旋控制以保证树的平衡性。

image.png
红黑存在的意义

但是对于平衡性,还需要考虑数据增加的平衡以及数据删除的平衡,增加和删除都是需要对树进行平衡修复。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:使用红黑树实现节点增减的平衡修复 | 带你学《Java语言高级特性》之四十二
更多Java面向对象编程文章查看此处

相关文章
|
28天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
63 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
20天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
47 2
|
3天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
14 4
|
18天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
39 3
|
18天前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
23 2
|
24天前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
30 6
|
24天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
41 3
|
27天前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
42 4
|
15天前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
14 0
|
1月前
|
分布式计算 安全 Java
Java语言的特点?
Java语言的特点?
下一篇
无影云桌面