红黑树原理解析以及Java实现

article/2025/11/3 7:58:18

转自:https://blog.csdn.net/u010853261/article/details/54312932

红黑树

本文的主要内容:
1、红黑树的基本概念以及最重要的5点规则。
2、红黑树的左旋转、右旋转、重新着色的原理与Java实现;
3、红黑树的增加结点、删除结点过程解析;

1.红黑树的基本概念与数据结构表示

首先红黑树来个定义:

红黑树定义:红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树(平衡二叉树的一种实现方式)。

我们知道一颗基本的二叉排序树他们都需要满足一个基本性质:即树中的任何节点的值大于它的左子节点,且小于它的右子节点。

按照这个基本性质使得树的检索效率大大提高。我们知道在生成二叉排序树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样势必会导致二叉树的检索效率大大降低(O(n)),所以为了维持二叉排序树的平衡,大牛们提出了各种平衡二叉树的实现算法,如:AVL,SBT,伸展树,TREAP ,红黑树等等。

平衡二叉树必须具备如下特性:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个子节点,其左右子树的高度都相近。下面给出平衡二叉树的几个示意图:

平衡二叉树和普通二叉树示意图

红黑树顾名思义就是结点是红色或者是黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树而言我们必须增加如下规则,这也是红黑树最重要的5点规则:

1、每个结点都只能是红色或者黑色中的一种。
2、根结点是黑色的。
3、每个叶结点(NIL节点,空节点)是黑色的。
4、如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5、从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。

这些约束强制了红黑树的关键性质: 从根到叶子最长的可能路径不多于最短的可能路径的两倍长。结果是这棵树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。所以红黑树它是复杂而高效的,其检索效率O(lg n)。下图为一颗典型的红黑二叉树:
典型的红黑树

上面关于红黑树的概念基本已经说得很清楚了,下面给出红黑树的结点用Java表示数据结构:

private static final boolean RED = true;
private static final boolean BLACK = false;
private Node root;//二叉查找树的根节点//结点数据结构
private class Node{private Key key;//键private Value value;//值private Node left, right;//指向子树的链接:左子树和右子树.private int N;//以该节点为根的子树中的结点总数boolean color;//由其父结点指向它的链接的颜色也就是结点颜色.public Node(Key key, Value value, int N, boolean color) {this.key = key;this.value = value;this.N = N;this.color = color;}
}/*** 获取整个二叉查找树的大小* @return*/
public int size(){return size(root);
}
/*** 获取某一个结点为根结点的二叉查找树的大小* @param x* @return*/
private int size(Node x){if(x == null){return 0;} else {return x.N;}
}
private boolean isRed(Node x){if(x == null){return false;}return x.color == RED;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

2.红黑树的三个基本操作

红黑树在插入,删除过程中可能会破坏原本的平衡条件导致不满足红黑树的性质,这时候一般情况下要通过左旋、右旋和重新着色这个三个操作来使红黑树重新满足平衡化条件。

旋转

旋转分为左旋和右旋。在我们实现某些操作中可能会出现红色右链接或则两个连续的红链接,这时候就要通过旋转修复。

通常左旋操作用于将一个向右倾斜的红色链接(这个红色链接链连接的两个结点均是红色结点)旋转为向左链接。对比操作前后,可以看出,该操作实际上是将红线链接的两个结点中的一个较大的结点移动到根结点上。

左旋的示意图如下:
左旋前

左旋后

左旋的Java实现如下:

/*** 左旋转* @param h* @return*/
private Node rotateLeft(Node h){Node x = h.right;//把x的左结点赋值给h的右结点h.right = x.left;//把h赋值给x的左结点x.left = h;//x.color = h.color;h.color = RED;x.N = h.N;h.N = 1+ size(h.left) + size(h.right);return x;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

左旋的动画效果如下:
左旋动画

右旋其实就是左旋的逆操作:
右旋前
右旋后
右旋的代码如下:

/*** 右旋转* @param h* @return*/
private Node rotateRight(Node h){Node x = h.left;h.left = x.right;x.right = h;x.color = h.color;h.color = RED;x.N = h.N;h.N = 1+ size(h.left) + size(h.right);return x;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

右旋的动态示意图:
右旋动态示意图

颜色反转

当出现一个临时的4-node的时候,即一个节点的两个子节点均为红色,如下图:
一个节点两个子结点都是红色
我们需要将E提升至父节点,操作方法很简单,就是把E对子节点的连线设置为黑色,自己的颜色设置为红色。颜色反转之后颜色如下:
颜色反转之后
实现代码如下:

/*** 颜色转换* @param h*/
private void flipColors(Node h){h.color = RED;//父结点颜色变红h.left.color = BLACK;//子结点颜色变黑h.right.color = BLACK;//子结点颜色变黑
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意:以上的旋转和颜色反转操作都是针对单一结点的,反转或则颜色反转操作之后可能引起其父结点又不满足平衡性质。

3. 红黑树的插入结点


http://chatgpt.dhexx.cn/article/KuyCM6ka.shtml

相关文章

红黑树平衡原理

红黑树定义 红黑树本身也是一种二叉树,只是它是一棵平衡的二叉树,也就是两个分支均匀生长的,左右平衡的二叉树,这样的二叉树有利于内存寻址,内存寻址的时间复杂度能够做到O(logN),我们知道数组的内存寻址时…

[Java 8 HashMap 详解系列]7.HashMap 中的红黑树原理

[Java 8 HashMap 详解系列] 文章目录 1.HashMap 的存储数据结构 2.HashMap 中 Key 的 index 是怎样计算的? 3.HashMap 的 put() 方法执行原理 4.HashMap 的 get() 方法执行原理 5.HashMap 的 remove() 方法执行原理 6.HashMap 的扩容 resize() 原理 7.HashMap 中的红黑…

红黑树原理详解及代码实现

文章目录 1. 红黑树概念2. 节点定义3. 旋转操作4. 插入操作5. 删除操作6. 完整代码 1. 红黑树概念 下图就是一棵红黑树: 为了后续操作中不出现空指针异常,可以加入一个额外的哨兵节点T,T作为所有叶子节点的子节点,作为根节点的父…

快速理解红黑树原理

快速理解红黑树原理 红黑树 简介 红黑树 其实就是一个二叉树。 1.0 常用的二叉树类型 简单说二叉树概念: 二叉树 又称度为至多二的树。 1.1 平衡二叉树 平衡二叉树又称 AVL 树 特点:一个根节点的左右个子树的高度差不超过1 平衡二叉树 非平衡二叉树…

数据结构-红黑树原理分析

前言 在阅读HashMap源码的时候发现,java1.8的HashMap的链表实现增加了红黑树,当链表长度超过指定阈值8的时候回进行树化。 为了提高增删查的效率。 而红黑树又比较复杂,所以专门写一篇关于红黑树的文章。 概念 R-B Tree,全称是…

红黑树原理剖析

首先介绍一下红黑树的几点性质: 性质1:根节点是黑色 性质2:每个叶子节点是黑色(指的是空叶子节点) 性质3:每个红色节点的两个子节点一定是黑色 (子节点必须同时存在或不存在) 性质4:任意一节点到每个叶子节点的路径都包含数量相同的黑节点(非空叶子…

红黑树原理及插入

文章目录 1、前言2、红黑树2.1、性质2.2、操作2.2.1、变色2.2.2、左旋2.2.3、右旋2.2.4、查找2.2.5、插入 2.3、插入情景2.3.1、红黑树为空树2.3.2、插入结点的Key已存在2.3.3、插入结点的父结点为黑结点2.3.4、插入节点的父节点为红色2.3.4.1、叔叔结点存在并且为红结点 2.3.5…

红黑树原理及代码实现(一)

红黑树简介 红黑树是一种自平衡的二叉查找树,它的统计性能要优于平衡二叉树,因此在很多地方都有应用,例如Java中的TreeMap,HashMap等数据结构都使用到了红黑树。红黑树对很多人来说熟悉而陌生,熟悉则是因为知道红黑树…

图解红黑树原理

一.红黑树的性质(一种自平衡的二叉查找树) 1. 根节点是黑色。 2. 节点是红色或黑色 3. 叶子节点都是黑色的空节点(NIL节点) 意思就是末尾一排是黑色空节点(可全部省略) (叶子节点意思是没有子…

红黑树原理和算法详细介绍

目录 1 R-B Tree简介 2 红黑树的时间复杂度和相关证明 3 红黑树的基本操作 1. 左旋 2. 右旋 3. 添加 4.1 删除 1 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储…

HashMap底层红黑树原理(超详细图解)+手写红黑树代码

在看完了小刘老师和黑马的源码视频之后,我整理了一篇HashMap的底层源码文章,学海无涯,这几天看了对红黑树的讲解,故将其整理出来 HashMap底层源码解析上 HashMap底层源码解析下 视频链接 小刘老师讲源码 传智播客-黑马程序员 文章目录 树结…

红黑树原理及java实现

红黑树 红黑树规则特点: 节点分为红色或者黑色;根节点必为黑色;叶子节点都为黑色,且为null;连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);从任意节点出发&…

红黑树原理及旋转

红黑树,本质上来说就是一棵二叉查找树 但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡 保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n) 但它是如何保证一棵n个结点的红黑树的高度始终保持在h logn的呢?这就引出了红黑…

HashMap红黑树原理分析

近期学习了 HashMap 实现原理,这篇咱们了解一下红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8最重要的就是引入了红黑树的设计,当hash表的单一链表长度超过 8 个的时候,链表结构就会转为红黑树结构。 01、故事的起…

HashMap源码学习:红黑树原理详解

文章导航 HashMap源码学习:红黑树原理详解 HashMap源码学习:JDK1.8版本源码解析 目录 文章导航前言概述红黑树的特性变色平衡右旋平衡左旋平衡 正文红黑树平衡方法:balanceInsertion红黑树左旋方法:rotateLeft红黑树右旋方法&…

红黑树原理讲解

红黑树原理讲解 一、红黑树的性质二、红黑树的3种变化策略?(为满足红黑树性质)1. 改变颜色2. 左旋3. 右旋 三、红黑树的插入情景1:红黑树为空树情景2:插入节点的key已经存在情景3:插入节点的父节点为黑色情…

红黑树原理详解

红黑树原理详解 红黑树的旋转红黑树上结点的插入红黑树上结点的删除 参考: 教你初步了解红黑树 红黑树(一)之 原理和算法详细介绍 红黑树定义: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。 [注意&…

红黑树原理

因为看的时候写在了纸上,于是直接扫描的,效果不太好。

HashMap红黑树原理解析

HashMap红黑树原理解析 定义: 简单来说红黑树是一种近视平衡二叉查找树,主要优点是”平衡”,即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度为log(n)。 下面先主要提一下红黑树…

红黑树的原理及实现

红黑树的原理及实现 一、什么是红黑树二、定义红黑树三、左旋和右旋四、红黑树插入节点 一、什么是红黑树 红黑树是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有…