`
wx1568037608
  • 浏览: 34736 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

红黑树

 
阅读更多

 

这篇文章写得简单易懂,很容易看懂,转载一下http://www.360doc.com/content/19/0510/10/63985477_834745870.shtml

前言

红黑树,对很多童鞋来说,是既熟悉又陌生。熟悉是因为在校学习期间,准备面试时,这是重点。然后经过多年的荒废,如今已经忘记的差不多了。如果正在看文章的你,马上快要毕业,面临着找工作的压力;又或者你觉得需要将这块知识重新复习一遍;又或者只是看看,那么恭喜你,赚到了。那么我将带领大家重新认识下红黑树,用简单的语言,搞懂红黑树。

在学习红黑树之前,咱们需要先来理解下二叉查找树(BST)。

二叉查找树

要想了解二叉查找树,我们首先看下二叉查找树有哪些特性呢?

1, 左子树上所有的节点的值均小于或等于他的根节点的值

2, 右子数上所有的节点的值均大于或等于他的根节点的值

3, 左右子树也一定分别为二叉排序树

我们来看下图的这棵树,他就是典型的二叉查找树

五分钟搞懂什么是红黑树(全程图解)

那问题来了,为什么一定要这种结构呢?换句话说这样的结构有什么好处呢?我们就来查找下值为10的节点。它怎么一步步的找到这个节点的?步骤是怎样的?接着往下看。

1, 查找到根节点9,看下图:

五分钟搞懂什么是红黑树(全程图解)

2, 由于10大于9的,所以查找到右孩子13,看下图:

五分钟搞懂什么是红黑树(全程图解)

3, 又因为10是小与13的,所以查找到左孩子11,看下图:

五分钟搞懂什么是红黑树(全程图解)

4, 这一步相比不用说了大家也都知道了,找到了左孩子,然后发现正好是10 。恰好是正要寻找的值。

五分钟搞懂什么是红黑树(全程图解)

可能又有童鞋会问,这不是二分查找的思想吗?确实,查找所需的最大次数等同于二叉查找树的高度。当然在插入节点的时候,也是这种思想,一层一层的找到合适的位置插入。但是二叉查找树有个比较大的缺陷,而且这个缺陷会影响到他的性能。我们先来看下有一种情况的插入操作:

如果初始的二叉查找树只有三个节点,如下图:

五分钟搞懂什么是红黑树(全程图解)

我们依次插入5个节点:7,6,5,4,3,。看下图插入之后的图:

五分钟搞懂什么是红黑树(全程图解)

看出来了吗?有没有觉得很别扭,如果根节点足够大,那是不是“左腿”会变的特别长,也就是说查找的性能大打折扣,几乎就是线性查找了。

那有没有好的办法解决这个问题呢?解决这种多次插入新节点而导致的不平衡?这个时候红黑树就登场了。

红黑树

红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成“瘸子”,左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外,还具体下列的特性:

1. 节点是红色或者黑色

2. 根节点是黑色

3. 每个叶子的节点都是黑色的空节点(NULL)

4. 每个红色节点的两个子节点都是黑色的。

5. 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。

看下图就是一个典型的红黑树:

五分钟搞懂什么是红黑树(全程图解)

很多童鞋又会惊讶了,天啊这个条条框框也太多了吧。没错,正式因为这些规则,才能保证红黑树的自平衡。最长路径不超过最短路径的2倍。

当插入和删除节点,就会对平衡造成破坏,这时候需要对树进行调整,从而重新达到平衡。那什么情况下会破坏红黑树的规则呢?

1,我们看下图:

五分钟搞懂什么是红黑树(全程图解)

向原来的红黑树插入值为14的新节点,由于父节点15是黑色节点,所以这种情况没有破坏结构,不需要做任何的改变。

2,向原树插入21呢?,看下图:

五分钟搞懂什么是红黑树(全程图解)

由于父节点22是红色节点,因此这种情况打破了红黑树的规则4,必须作出调整。那么究竟该怎么调整呢?有两种方式【变色】和【旋转】分为【左旋转】和【右旋转】。

【变色】:

为了符合红黑树的规则,会把节点红变黑或者黑变红。下图展示的是红黑树的部分,需要注意节点25并非根节点。因为21和22链接出现红色,不符合规则4,所以把22红变黑:

五分钟搞懂什么是红黑树(全程图解)

但这样还是不符合规则5,所以需要把25黑变红,看下图:

五分钟搞懂什么是红黑树(全程图解)

你以为现在结束了?天真,因为25和27又是两个连续的红色节点(规则4),所以需要将27红变黑。

五分钟搞懂什么是红黑树(全程图解)

终于结束了,都满足规则了,舒服多了。

【左旋转】

也就是逆时针旋转两个节点,使父节点被自己的右孩子取代,而自己成为自己的左孩子,听起来吓死人,直接看图吧:

五分钟搞懂什么是红黑树(全程图解)

【右旋转】

顺时针旋转两个节点,使得自己的父节点被左孩子取代,而自己成为自己的右孩子,看不懂直接看图吧:

五分钟搞懂什么是红黑树(全程图解)

看起来这么复杂,到底怎么用呢?确实很复杂,我们讲下典型的例子,大家参考下:

以刚才插入21节点的例子:

五分钟搞懂什么是红黑树(全程图解)

首先我们需要做的是变色,把节点25以及下方的节点变色:

五分钟搞懂什么是红黑树(全程图解)

由于17和25是连续的两个红色节点,那么吧节点17变黑吗?这样是不行的,你想这样一来不就打破了规则4了吗,而且根据规则2,也不可能吧13变成红色。变色已经无法解决问题了,所以只能进行旋转了。13当成X,17当成Y,左旋转试试看:

五分钟搞懂什么是红黑树(全程图解)

五分钟搞懂什么是红黑树(全程图解)

五分钟搞懂什么是红黑树(全程图解)

由于根节点必须是黑色,所以需要变色,结果如下图:

五分钟搞懂什么是红黑树(全程图解)

继续,其中有两条路径(17-)8->6->NULL)的黑色节点个数不是3,是4不符合规则。

这个时候需要把13当做X,8当做Y,进行右旋转:

五分钟搞懂什么是红黑树(全程图解)

五分钟搞懂什么是红黑树(全程图解)

五分钟搞懂什么是红黑树(全程图解)

最后根据规则变色:

五分钟搞懂什么是红黑树(全程图解)

这样一来,我们终于结束了,经过调整之后符合规则。

那我们费这么大力气,这么复杂,这东西用在哪里,有哪些应用呢?

其实STL中的map就是用的红黑树。

分享到:
评论

相关推荐

    红黑树-动态演示生成红黑树

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,由计算机科学家鲁道夫·贝尔在1978年提出。它在保持二叉查找树特性的同时,通过引入颜色属性来确保树的平衡,从而提高了数据操作的效率。红黑树的主要目标是保证在...

    红黑树的源码与测试函数

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,它的每个节点都带有颜色属性,可以是红色或黑色。这种数据结构被广泛应用于计算机科学的许多领域,特别是操作系统、数据库系统以及编译器中,用于高效地执行插入、...

    红黑树原理详解

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年发明。它的名称来源于其节点颜色属性,即红色和黑色。红黑树的主要特性保证了其在插入、删除和查找操作中的高效性能,通常时间复杂度为O(log n),其中n是树中...

    红黑树-使用C++实现-简单练习

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer于1972年提出。它的设计目标是在保持二叉查找树基本属性的同时,通过引入颜色(红色或黑色)来保证树的平衡,从而在插入和删除操作后能够快速恢复平衡状态,减少查找、...

    红黑树的插入与删除_详细整理资料

    ### 红黑树的插入与删除:详细解析 红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年发明,最初被称为“对称二叉B树”。它在1978年Leo J. Guibas和Robert Sedgewick的论文中获得了现代名称“红黑树”。红黑树...

    红黑树和AVL树的实现

    红黑树和AVL树是两种自平衡二叉查找树,它们在计算机科学中的数据结构领域扮演着重要的角色,主要用于高效地存储和检索数据。这两种数据结构的主要目标是在插入和删除操作后保持树的平衡,从而确保搜索、插入和删除...

    红黑树java操作代码 红黑树是java里面遍历性能最好数据结构

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,它在计算机科学中扮演着重要的角色,尤其是在实现高效的数据结构和算法时。在Java中,虽然标准库并未直接提供红黑树的类,但我们可以自定义实现,如提供的`Red...

    红黑树完整实现文件

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出。它的设计目标是在保持二叉查找树基本属性的同时,通过引入颜色(红色或黑色)来保证树的平衡,从而提高查找、插入和删除操作的效率。在红黑树中,每个...

    红黑树代码

    红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树...

    gcc 红黑树(二叉搜索树 红黑树 动态排序树 精确计时)

    红黑树是一种自平衡二叉查找树,它的设计目的是为了在保持查找效率的同时,尽可能地减少插入和删除操作带来的性能损失。在计算机科学中,它是一种广泛应用的数据结构,特别是在动态排序和高效查找方面。 二叉搜索树...

    Linux内核红黑树封装的通用红黑树

    通用红黑树 说明: 用Linux内核红黑树封装的一个通用型的红黑树 如何使用该红黑树: 见rbtest1.c和rbtest2.c 直接make生成rbtest1和rbtest2 作者:rcyh 日期:2011年7月21日 ---------------------------------...

    红黑树的C实现,算法导论的红黑树C实现

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出。它的设计目标是在保持二叉查找树基本性质的同时,通过引入颜色属性来保证树的平衡,从而达到高效的插入、删除和查找操作。红黑树的关键特性是: 1. 每...

    红黑树的例子

    ### 红黑树知识点详解 #### 一、红黑树定义与性质 红黑树是一种自平衡二叉查找树,其每个节点除了保存键值、左子节点、右子节点和父节点的信息外,还额外保存了一个表示颜色的属性(红色或黑色)。红黑树在进行...

    红黑树、区间树

    红黑树和区间树是两种在计算机科学中广泛使用的数据结构,主要应用于高效的数据存储和检索。它们在算法和数据结构领域具有重要地位,尤其在处理动态集合或需要快速查找和更新操作的问题时。 首先,我们来详细了解...

    红黑树-数据结构

    红黑树是一种自平衡二叉查找树(self-balancing binary search tree),由计算机科学家Rudolf Bayer在1972年提出。它在保持二叉查找树特性的同时,通过引入颜色属性来确保树的平衡,从而提高数据操作的效率。在红黑...

    红黑树实现源码

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,它在计算机科学中扮演着重要的角色,尤其是在数据结构和算法领域。红黑树的名字来源于它的节点颜色属性:红色或黑色。这种颜色属性被用来确保树的某些关键性质,...

    红黑树的插入详细图解,直接拿下红黑树

    红黑树是一种自平衡二叉查找树,它的主要特点是在保持二叉查找树特性的同时,通过特定的颜色规则来确保树的平衡,以达到快速查找、插入和删除的目的。红黑树的每个节点都有一个颜色属性,可以是红色或黑色。在插入新...

    用c实现的红黑树,经典的红黑树,

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出。它的设计目标是在保持查询效率高的同时,尽可能地减少由于插入和删除操作引起的树的不平衡。红黑树的主要特点包括: 1. **颜色属性**:每个节点都有...

    红黑树Java实现

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,它在计算机科学中扮演着重要的角色,尤其是在数据结构和算法领域。红黑树的名字来源于它的节点颜色属性:红色或黑色。这种颜色属性用于确保树的平衡,使得在树中的...

    delphi红黑树源码

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,由计算机科学家Rudolf Bayer在1972年提出。它在数据结构和算法领域具有重要地位,被广泛应用于各种系统和软件中,包括数据库索引、编译器、虚拟机等。在Delphi编程...

Global site tag (gtag.js) - Google Analytics