认识红黑树,解决二叉树删除后遗症 | 带你学《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面向对象编程文章查看此处

相关文章
|
18天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
6天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
53 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
6天前
|
网络协议 Java 数据库连接
Java语言的特点
【5月更文挑战第7天】Java是一种面向对象的编程语言,强调数据和操作的封装,具备平台独立性,能“一次编写,到处运行”。它有自动垃圾收集机制,消除手动内存管理。Java是强类型语言,注重安全性,并支持多线程编程。其丰富的API库和对网络编程的良好支持增强了功能。此外,Java的可扩展性使其能轻松适应新需求和扩展。
21 4
|
6天前
|
分布式计算 Java 大数据
Java语言主要应用领域
【5月更文挑战第7天】Java在嵌入式系统中以低至130KB的占用展现可靠性,实现“一次编写,到处运行”。在大数据领域,Java通过Hadoop、Hbase、Accumulo和ElasticSearch等工具发挥关键作用。Java也是Eclipse、IntelliJ IDEA和NetBeans等开发工具的基础。广泛应用于电商网站和金融服务器系统,即便在J2ME式微后,仍能在部分低端手机中找到其踪影。
17 4
|
14天前
|
Java
Java语言---面向对象的三大特征之继承
Java语言---面向对象的三大特征之继承
|
14天前
|
存储 Java
Java语言--->数据类型转化以及运算符
本文讲述了Java中的基本数据类型转换和运算符。在转换中,布尔型除外的8种类型可通过默认或强制转换相互转化,如`byte-&gt;short-&gt;int-&gt;long-&gt;float-&gt;double`。默认转换发生在不同类型运算时,系统会转为更大容量类型。强制转换可能引起精度损失或溢出。运算符包括算术(如+可做加法或字符串拼接)、比较、逻辑和赋值运算符。比较运算符如`==`、`&lt;`等产生`boolean`结果,逻辑运算符`&&`、`||`具有短路效应。赋值运算符如`+=`简化了赋值过程。运算符的优先级也进行了简要说明。
|
14天前
|
Java 编译器 程序员
Java语言基础
Java语言基础概览:涵盖关键字(全小写,如`image.png`所示),保留字(如`goto`、`const`),标识符命名规则(避免数字开头和保留字),注释(单行`//`,多行`/*...*/`,及Javadoc注释)以及变量(按数据类型:byte, short, int, long, float, double, char, boolean,注意声明规则和默认类型)。
|
Java
java实现简单的二叉树ADT
java实现简单的二叉树ADT
133 0
|
Java 程序员
java实现简单二叉树
java实现简单二叉树
355 0
java实现简单二叉树
用Java实现一个简单二叉树
前置知识: 什么是二叉树:一个递归的树形数据结构,每个节点最多有两个子节点;二叉树一般都是二分查找树,每个节点的值大于它左子节点的值,小于它右子节点的值
806 0
用Java实现一个简单二叉树