首页 > 其他分享 >红黑树

红黑树

时间:2024-04-10 23:33:44浏览次数:9  
标签:左子 右子 旋转 红黑树 左旋 节点

红黑树

目录

什么是红黑树(非完全平衡二叉树)?

  • 红黑树 是一种自平衡二叉搜索树(二叉查找树)是一种特殊的搜索二叉树,在进行插入和删除时通过特定操作保持二叉树自身的平衡,从而获得较高的查找性能。

红黑树再平衡方法?

  • 左旋:以某个节点作为支点左旋,支点的左子节点不变。其右边节点变为其父节点,右节点的左子节点断开成为旋转节点的右子节点,右边节点左子节点是旋转节点 右节点不变。
  • 右旋: 以某个节点作为支点右旋,支点的右子节点不变。其左边节点变为其父节点。左节点的右子节点断开成为旋转节点的左子节点。左边的节点右子节点是旋转节点。左节点不变。
  • 变色:将节点的颜色由红变黑或由黑变红

左旋和右旋是互相逆转的。
通过再平衡的方法最坏的情况的运行时间得到了优化 可以再O(logN)的时间复度内完成查找,删除 和插入 N是二叉树中的节点数。

二叉树的特点

  • 如果二叉树节点的左子树不为空,那么左子树的所有节点度小于此节点。
  • 如果二叉树节点的右子树不为空,那么右子树的所有节点都大于此节点。

红黑树的特点

  • 节点是红色或者黑色。
  • 根节点是黑色。
  • 所有叶子节点都是黑色的空节点
  • 每个红色节点的叶子节点都是黑色节点(从每个叶子节点到根的所有路径上不能有两个连续的红色节点)
  • 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。

红黑树左旋右旋变色示例:

三、红黑树的左旋和右旋操作

对于一棵红黑树,它满足红黑树的5条特性。插入或删除节点之后,红黑树就发生了变化,很可能不再完全满足红黑树的5条特性了,也就是不再是一棵红黑树了,而是一棵普通的二叉搜索树。这时候,为了使二叉搜索树重新变成红黑树,就需要对二叉搜索树进行操作,使它满足红黑树的5条特性。

通过旋转,可以使二叉搜索树重新满足红黑树的5条特性。旋转分为左旋和右旋。

  1. 红黑树的左旋

左旋:以某个节点作为支点(旋转节点),其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,旋转节点的左子节点保持不变。右子节点的左子节点相当于从右子节点上“断开”,重新连接到旋转节点上。

为了不失一般性,可以看下图中的例子。左边是左旋前的红黑树局部结构,先不考虑整体,只看局部,左旋前不满足红黑树的特性5。

左旋时,旋转节点为节点50,左旋后,旋转节点的右子节点70变为旋转节点50的父节点,右子节点的左子节点60从右子节点70上“断开”,成为旋转节点50的右子节点。

左旋后,结构如右图,这个局部重新满足了红黑树的特性5,达到目的。

img

再看另一个左旋的例子,左边是左旋前的局部结构,以节点10作为旋转节点,左旋后,旋转节点的右子节点20成为旋转节点10的父节点,右子节点的左子节点(这里是一个叶子节点NIL)从右子节点上“断开”,成为旋转节点10的右子节点。

img

  1. 红黑树的右旋

右旋:以某个节点作为支点(旋转节点),其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,旋转节点的右子节点保持不变。左子节点的右子节点相当于从左子节点上“断开”,重新连接到旋转节点上。

不难看出,左旋和右旋是相反的,可逆的。

下图中的例子仍然是红黑树的局部,左边的结构不满足红黑树的特性5。

右旋时,旋转节点为节点70,右旋后,旋转节点的左子节点50变为旋转节点70的父节点,左子节点的右子节点60从左子节点50上“断开”,成为旋转节点70的左子节点。右旋后(右图),重新满足了红黑树的特性5。

img

同样再看一个右旋的例子,左边是右旋前的局部结构,以节点30作为旋转节点,右旋后,旋转节点的左子节点20成为旋转节点30的父节点,左子节点的右子节点(这里是一个叶子节点NIL)从左子节点上“断开”,成为旋转节点30的左子节点。

img

通过对左旋和右旋的介绍和举例,左旋和右旋的目的都是通过旋转节点的方式使二叉搜索树重新满足红黑树的特性,左旋和右旋是互逆的,根据不同的情况使用不同的旋转方式。

四、红黑树的变色操作

当对红黑树进行插入或删除节点之后,如果不再完全满足红黑树的5条特性,除了旋转,变色也可以使二叉搜索树重新满足红黑树的5条特性。

变色:将节点的颜色由红变黑或由黑变红。

向红黑树中插入节点时,新节点的颜色都设置为红色。不管新节点是什么颜色,特性3都不可能被破坏,特性1、2、4都有可能被破坏。如果插入的节点是黑色,则一定会破坏特性5,需要进行调整,如果插入的节点是红色,则一定不会破坏特性5。所以将新节点设置为红色,可以降低破坏红黑树特性的可能性。

  1. 添加节点

如下的左图是红黑树的一个局部,一开始是满足红黑树的特性的,在其中插入了红色节点10,两个红节点连在一起了,不再满足红黑树的特性4。

img

通过变色,先将节点20变成黑色,特性4满足了,但又不满足特性5,所以继续将节点30变成红色,节点40变成黑色。

img

经过3次变色后,从局部看,已经重新满足了红黑树的特性。但是,从整棵树来看,还不一定满足红黑树的特性,如果节点30的父节点也是红色,则还需要继续对这棵树进行调整(上面的左旋和右旋例子中也有这种情况)。

  1. 删除节点

如下的左图是红黑树的一个局部,一开始是满足红黑树的特性的,将节点90删除后,不再满足红黑树的特性5。

img

通过变色,先将节点80变成黑色,但仍不满足特性5,继续将节点70变成红色,重新满足了红黑树的特性。
img
经过两次变色,重新满足了红黑树的特性,对于这个例子,只要局部满足了,整棵树一定是满足红黑树的。

红黑树的旋转和变色综合案例

上文中介绍旋转和变色时,是独立对它们进行分析的。这两种调整方法都可以使被破坏规则的红黑树重新满足红黑树的特性,更多的时候,需要灵活地配合使用,使调整更高效。
下面来看一个简单的例子。使用文章开头的红黑树,结构如下图。

  1. 在红黑树中插入节点20,插入后不满足红黑树的特性4。
    img
  2. 将节点18从红色变成黑色,变色后不满足红黑树的特性5。
    img
  3. 以节点10作为旋转节点,进行左旋,左旋后还是不满红黑树的特性5。
    img
  4. 将节点10从黑色变成红色,变色后,重新满足了红黑树的5条特性。
    img
    经过变色,左旋,变色,三个步骤之后,插入节点后的树重新成为一棵红黑树。

标签:左子,右子,旋转,红黑树,左旋,节点
From: https://www.cnblogs.com/heyanfeng/p/18127697

相关文章

  • 【C++进阶】详解红黑树&&手撕红黑树(模拟实现)!!!
    红黑树详解&&模拟实现一,红黑树的概念二,红黑树的特性三,红黑树的结构四,红黑树的迭代器五,模拟实现红黑树插入操作六,红黑树的检查一,红黑树的概念红黑树也是一颗二叉搜索树,相比于AVL树的插入,红黑树没有那么多的旋转,对平衡的检查没有那么的严格,所以是接近平衡的。红黑树,......
  • 红黑树的平衡之道:深入解析右旋操作的原理与实践
    红黑树的平衡之道:深入解析右旋操作的原理与实践一、红黑树旋转的背景二、右旋(RIGHT-ROTATE)的原理三、右旋(RIGHT-ROTATE)的算法步骤四、右旋(RIGHT-ROTATE)的伪代码五、右旋(RIGHT-ROTATE)的C代码实现五、结论红黑树作为一种高效的平衡搜索树,其插入和删除操作的时间复杂度......
  • 数据结构:二叉搜索树、平衡二叉树(AVL树)、红黑树、B树、B+树
    个人理解浅谈数据结构,应对八股文面试目录前言一、二叉搜索树(二叉排序树、二叉查找树、AVL树)(1)二叉树的特点:(2)二叉树的优缺点二、平衡二叉树(高度平衡树,最早的自平衡二叉树)(1)平衡二叉树的特点:(2)平衡二叉树的优缺点三、红黑树(1)红黑树的特点(2)红黑树的优缺点四、红黑树......
  • 定义一棵松弛红黑树及其根结点颜色转换后的影响
    定义一棵松弛红黑树及其根结点颜色转换后的影响1.红黑树的性质2.松弛红黑树的定义3.根节点颜色变化的影响4.伪代码实现5.C语言代码实现6.结论在计算机科学中,红黑树是一种自平衡的二叉搜索树,它在许多数据结构和算法问题中都有着广泛的应用。红黑树通过一系列精心......
  • 红黑树的性质与操作:吸收红结点及其对树结构的影响
    红黑树的性质与操作:吸收红结点及其对树结构的影响1.红黑树的基本性质2.吸收红结点的过程2.1黑色结点的度2.2叶结点深度3.伪代码实现4.C语言代码实现5.结论红黑树作为一种高效的自平衡二叉搜索树,在计算机科学中扮演着重要的角色。它通过一系列复杂的操作来维护其平......
  • 可视化红黑树详解(gif图演示,洛谷P3369 普通平衡树)
    写在前面推荐一个很实用的工具:红黑树可视化本文参考OIwiki中的红黑树代码,读者也可以参考该篇解析(写得还是很不错的),不过OIWiki里删除后平衡维护的Case4和Case5在代码细节上稍微有些问题(把c......
  • Linux内核数据管理利器--红黑树
    目录写在前面1.红黑树的原理2.红黑树操作2.1红黑树的节点插入2.2红黑树的节点删除2.3红黑树的查询操作3.红黑树操作实验附录A:实验代码写在前面本文通过两个方面让读者可以深入理解Linux内核中红黑树RBTree的实现以及使用,读完此文章,你可以收获:红黑树的特性红黑树的......
  • 二叉搜索树 BST 、平衡二叉查找树 AVL 、红黑树
    看的是LeetCode一位博主的总结,码住,写得不错。二叉查找树AVL树在插入删除操作时对经过的路经节点进行递归平衡(balance方法,核心是判断左右子树之间的树高关系,然后调用对应的单/双旋转方法)。其他部分其实和BST差不多一样的。红黑树......
  • C++:map&set 对红黑树的封装
    C++:map&set对红黑树的封装将红黑树封装为泛型Find接口迭代器insert接口map的operator[]接口总代码展示C++的STL库中,把红黑树封装为了两个容器map与set,本博客将基于红黑树,来实现map和set的封装。如果不了解红黑树,可见博客[数据结构/C++:红黑树]将红黑树封装为泛型......
  • 红黑树(STL-ordered_map)
    目录一、概念: 二、红黑树的结点三、红黑树的插入四、迭代器(核心:结点指针)五、应用 一、概念:    为了保持AVL树的平衡性,AVL树需要频繁地调整全树整体拓扑结构,代价较大。为此在AVL树的平衡标准上进一步放宽条件,引入红黑树的概念:每个结点都是黑色或者红色......