1. 前言

红黑树是二叉搜索树的一种, 为什么要设计红黑树呢?主要原因是二叉搜索树上面的操作,比如search、insert、delete的一些操作的,其时间复杂度为O(h)。主要和树的深度有关。因此搜索树的深度较低时,这些集合操作执行地比较快。然而,如果树的高度较高的时候,这些集合操作可能比不上链表的执行得快。那么为了设计一种高效地二叉搜索树,主要的做法就是降低树的深度。红黑树就是为了降低二叉搜索树的深度来设计的,可以保证对红黑树的操作在最坏和最好的情况下基本动态集合操作的时间复杂度为O(logN)。

2. R-B Tree简介

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。对红黑树的操作在最坏的情形下花费O(logN)时间。

红黑树的特性:

  1. 每个节点或者是黑色,或者是红色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  4. 如果一个节点是红色的,则它的子节点必须是黑色的。
  5. 从一个节点到null引用的每一条路径必须包含相同数目的黑色节点。

红黑树的着色法则的一个结论,红黑树的高度最多是2log(N+1)

3. R-B Tree应用

红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

4. 红黑树的基本操作:左旋和右旋

红黑树的基本操作是添加删除。在对红黑树进行添加或删除之后,都会用到旋转方法。为什么呢?道理很简单,添加或删除红黑树中的节点之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一颗红黑树了,而是一颗普通的树。而通过旋转,可以使这颗树重新成为红黑树。简单点说,旋转的目的是让树保持红黑树的特性。
旋转包括两种:左旋右旋。下面分别对它们进行介绍。

4.1 左旋

对x进行左旋,意味着"将x变成一个左节点"。

理解左旋之后,看看下面一个更鲜明的例子。你可以先不看右边的结果,自己尝试一下。

4.2 右旋

对Y进行右旋,意味着"将Y变成一个右节点"。

理解右旋之后,看看下面一个更鲜明的例子。你可以先不看右边的结果,自己尝试一下。

4.3 区分左旋和右旋

仔细观察上面"左旋"和"右旋"的示意图。我们能清晰的发现,它们是对称的。无论是左旋还是右旋,被旋转的树,在旋转前是二叉查找树,并且旋转之后仍然是一颗二叉查找树。

左旋示例图(以x为节点进行左旋):

                               zx                          /                  / \      --(左旋)-->       xy   z                      /y

对x进行左旋,意味着,将“x的右孩子”设为“x的父亲节点”;即,将 x变成了一个左节点(x成了为z的左孩子)!。 因此,左旋中的“左”,意味着“被旋转的节点将变成一个左节点”。

右旋示例图(以x为节点进行右旋):

                               yx                            \                 / \      --(右旋)-->           xy   z                            \z

对x进行右旋,意味着,将“x的左孩子”设为“x的父亲节点”;即,将 x变成了一个右节点(x成了为y的右孩子)! 因此,右旋中的“右”,意味着“被旋转的节点将变成一个右节点”。

5. 红黑树的基本操作:添加

将一个节点插入到红黑树中,需要执行哪些步骤呢?首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。详细描述如下:

  • 第一步: 将红黑树当作一颗二叉查找树,将节点插入。
  • 第二部:将插入的节点着色为"红色"。
  • 第三步:通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。

6. 红黑树基本操作:删除

将红黑树内的某一个节点删除。需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。详细描述如下:

  • 第一步:将红黑树当做是一颗二叉查找树,将节点删除。
  • 第二步:通过“旋转和重新着色”等一系列操作来修正该树,使之重新成为一颗红黑树。’,

数据结构和算法分析: 红黑树相关推荐

  1. 数据结构 - 学习笔记 - 红黑树

    数据结构 - 学习笔记 - 红黑树 定义 简介 知识点 1. 结点属性 2. 前驱.后继 3. 旋转 查找 插入 父结点为黑色 父结点为红色 1. 有4种情形只需要变色(对应234树4结点) 1.1. ...

  2. 数据结构之「红黑树」

    红黑树 红黑树(Red–black tree)是一种自平衡二叉查找树.红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色. 红黑树的特性: 1.节点要么是红色要么就是黑色,不能没有颜色. 2 ...

  3. 数据结构与算法 / 红黑树

    一.定义 根节点是黑色的. 叶子节点是空的且是黑色的. 任何相邻的节点不能都为红色. 任意节点到其每个叶子节点的路径上,黑色的节点的数量相同. 二.性质 红黑树解决了 AVL 树增.删时耗时过大的问题 ...

  4. 高级数据结构与算法 | 红黑树(Red-Black Tree)

    文章目录 红黑树 红黑树的概念 红黑树的性质 红黑树与AVL树 红黑树的实现 红黑树的节点 红黑树的插入 红黑树的查找 红黑树的验证 完整代码 红黑树 红黑树的概念 红黑树,是一种二叉搜索树,但在每个 ...

  5. 父子结构查询_Java面试准备(5)之数据结构与算法——红黑树

    欢迎点赞评论+关注~~~~~~~ 如上图,二叉查找树极端情况下可能会变成一个单链表,这种查询时间复杂度就变成O(n)了,红黑树在二叉查找树的基础上进行了自平衡. 1.原理分析 如上图,红黑树具有以下特 ...

  6. 数据结构拾遗(1) --红黑树的设计与实现(上)

    红黑树是一种自平衡的二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组(C++ STL 中的map/set).它是在1972年由Rudolf Bayer发明的,他称之为" ...

  7. MySQL索引数据结构二叉树、红黑树、B-Tree、B+Tree、Hash

    索引:帮助MySQL高效获取数据的有序的数据结构. 假设我们有一张表table,包含Clo1和Clo2两个字段 内存地址 Clo1 Clo2 0x07 1 36 0x5A 2 20 0x7A 3 80 ...

  8. 数据结构拾遗(3) --红黑树的设计与实现(下)

    完整源代码: http://download.csdn.net/detail/hanqing280441589/8450041 红黑节点设计与实现 template <typename Comp ...

  9. 数据结构拾遗(2) --红黑树的设计与实现(中)

    Insert完善 根据规则4, 新增节点必须为红; 根据规则3, 新增节点之父节点必须为黑. 示例: (1)插入16(红色)/55(红色), 则既不用旋转, 也不用重新染色 (2)插入82(红色),  ...

  10. HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转

    树结构是数据结构中最经典最常用的结构之一,也是面试中常问的面试题,最近学习了一下红黑树的知识,记录整理一下 文章目录 一.红黑树的特征 二.变色左旋和右旋 1.变色规则 2.左旋 3.右旋 总结 前言 ...

最新文章

  1. 手机APP功能测试经验分享2016.06.06
  2. wxPython 笔记(3)基本结构
  3. 将列表转成数组_漫画 | 什么是散列表(哈希表)?
  4. visio保存后公式变形_涨姿势了!仿真变形后的模型还能保存下来
  5. 基于物理的渲染-用真实的环境光照亮物体
  6. 厉害!中国AI企业50强榜单!看完员工待遇,网友:我酸了!
  7. python sublime 提示补全_【原创】Sublime+Verilator建立强大的verilog编写环境
  8. 报错,can‘t found the source action, can‘t run the graph[fatal.flow]
  9. 物联网-移柯L206模块TCP开发(基于STM32+AT命令)
  10. python内置对象是什么_Python的内置对象类型——元组、文件,python
  11. centos 实现ssh远程连接docker
  12. 计算机二级是要报所有科目吗,我要报考计算机等级考试二级,是全部科目都要考吗?...
  13. 【物流选址】基于matlab麻雀搜索算法求解物流选址问题【含Matlab源码 H003期】
  14. android驱动程序失败,android studio 3.0中的haxm错误需要数字签名的驱动程序
  15. 推荐一个 Linux 刻盘工具 gcdw(转)
  16. Unity移动端、WebGL 四边形线框Shader 实现
  17. 从零开始的WTL入门教程(1) WTL的简介,环境搭建
  18. 中南民大 通原复习ch3之随机过程
  19. 「小白学Python」Windows安装Python
  20. OsgEarth中设置模型运动路径,并绘制雷达扫描、动态实时绘制运动轨迹、跟随彩带

热门文章

  1. Visual Studio 中指定自定义生成事件
  2. 使用快速傅里叶变换计算大整数乘法-代码
  3. 《一个程序猿的生命周期》读后感
  4. Hadoop fs命令详解
  5. 关于工资的三个秘密【转载】
  6. MVC3中的tempdata,viewdata,viewbag总结
  7. 我们小时候,开学是这样的!差点看哭了!
  8. 甲骨文正式发布Java 14(Oracle JDK 14)
  9. 详解C中volatile关键字
  10. mendeley 多PC同步