当前位置:   article > 正文

终于搞懂红黑树!--红黑树的原理及操作_associative array是什么树

associative array是什么树

红-黑-树

 

介绍:

红黑树( Red black tree)是种自平衡二叉查找树,在计算机科学中用到的一种数据结构。


它是在1972年由 Rudolf Bayer发明的当时被称为平衡二叉B树( symmetric binary B-trees)。后来,在1978年被 Leo. guibas和 Robert sedgewick修改为如今的红黑树R-B Tree,全称是Red- Black tree,又称为“红黑树",它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red或黑(Back)

性质:

  • 红黑树是一棵平衡二叉搜索树,其中序遍历单调不减
  • 节点是红色或黑色。
  • 根节点是黑色。
  • 每个叶节点(也有称外部节点的,目的是将红黑树变为真二叉树,即NULL节点,空节点)是黑色的。
  • 每个红色节点的两个子节点都是黑色。(换句话说,从每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 从根节点到每个叶子的所有路径都包含相同数目的黑色节点(这个数值叫做黑高度)。

                                  观察下面这颗红黑树(自行脑补外部节点NULL)

                                                      

事实,每一颗红黑树都有等价的B-树,如上图的红黑树对应的等价B-树(2,3,4树)如下:

                                          

因此,学好红黑树的诀窍就是:心中有B-树

 

左旋与右旋:

左旋:                                                                             

                              

   右旋 :

    

 

具体旋转类型与操作请点:LL,RR,LR,RL

 

插入的调整策略:

在对红黑树进行插入操作时,我们一般总是插入红色的节点,因为这样可以在插入过程中尽量避免对树的调。

那么,我们插入一个节点后,可能会使原树的哪些性质改变列?


如果插入的节点是根节点,性质2会被破坏,如果插入节点的父节点是红色,则会破坏性质4.

因此,总而言之,插入一个红色节点只会破坏性质2或性质4我们的恢复策略很简单,插入修复具体操作情况:

情况1:

  • 插入的是根节点。
  • 原树是空树,此情况只会违反性质2。

对策:直接把此节点涂为黑色。


情况2:

  • 插入的节点的父节点是黑色
  • 此不会违反性质2和性质4,红黑树没有被破坏。

对策:什么也不做。

 

情况3:当前节点的父节点是红色且祖父节点的另一个子节点(叔叔节点)是红色

此时父节点的父节点一定存在,否则插入前就已不是红黑树。与此同时,又分为父节点是祖父节点的左子还是右子,对于对称性,我们只要解开一个方向就可以了。在此,我们只考虑父节点为祖父左子的情况。同时,还可以分为当前节点是其父节点的左子还是右子,但是处理方式是一样的。我们将此归为同一类

对策:将当前节点的父节点和叔叔节点涂黑,祖父节点涂红,把当前节点指向祖父节点,从新的当前节点重新开始算法。

 

情况4:当前节点的父节点是红色叔叔节点是黑色,当前节点是其父节点的右子

对策:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。

 

情况5:当前节点的父节点是红色叔叔节点是黑色,当前节点是其父节点的左子

策略:父节点变为黑色,祖父节点变为红色,在祖父节点为支点右旋

 

 

针对情况3:

                                       

观察这棵树的一个结点N的值为4,显然4是红色的,它的父节点也是红色的,所以违背了(红色结点的子节点都是黑色的)性质

那么我们针对这种情况,利用情况三的对策,将当前节点的父节点和叔叔节点涂黑,祖父节点涂红,把当前节点指向祖父节点;

调整后:

                                           

调整后发现(  2->7  )还是违背红黑树的性质,那么观察后发现这是第4种情况;

当前7结点:

利用情况4的策略:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。

调整后:

                                        

调整后发现还是不符合(可能开始想这树怎么这么多B事!难道是B树?),这时我们会发现这是第五种情况:

当前2结点:

利用情况5的策略:父节点变为黑色,祖父节点变为红色,在祖父节点为支点右旋

                                

这样就发现已经满足的了红黑树的性质

一个在线 动态数据结构可视化  的网址:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html  (我觉得很好用)

                               

 

总结:经过上面情况3、情况4、情况5等3种插入修复情况的操作示意图,自会发现,后面的情况4、情况5都是针对情况3插入节点4以后,进行的一系列插入修复情况操作,不过,指向当前节点N指针一直在变化。所以,你可以认为:整个下来,情况3、4、5就是一个完整的插入修复情况的操作流程

 

树与二叉树:https://blog.csdn.net/alzzw/article/details/97283324

线索二叉树:https://blog.csdn.net/alzzw/article/details/97423394
哈夫曼树:https://blog.csdn.net/alzzw/article/details/97809047

二叉搜索(排序)树;https://blog.csdn.net/alzzw/article/details/97563011
平衡二叉树:https://blog.csdn.net/alzzw/article/details/97613193

B树~B+树:https://blog.csdn.net/alzzw/article/details/97633941

 

红黑树的应用场景:

  1. 标准模板库:
  • 标准模板库(英文:Standard Template Library,缩写:STL),是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。其中包含4个组件,分别为算法、容器、函数、迭代器。
  • 模板是C++程序设计语言中的一个重要特征,而标准模板库正是基于此特征。标准模板库使得C++编程语言在有了同Jaa一样强大的类库的同时,保有了更大的可扩展性。

     2.Java中的TreeMap

  • Java中的TreeMap用于实现地图界面和可导航 -与抽象类一起映射。地图根据其键的自然顺序排序,或者由地图创建时提供的比较器排序,具体取决于使用的构造函数。这被证明是一种效率

     3.Java HashMap

  • HashMap中的哈希映射是Java 1.2以来Java集合的一部分。它提供了Java的Map接口的基本实现。它将数据存储在Key,Value)对中。要访问一个值,必须知道它的关键Hash Map被称为Hash Map,因为它使用了一种名为Hashing Hashing的技术

     4.关联数组

  • 在计算机科学中,关联数组(英语:Associative Array),又称映射(Map)、字典( Dictionary)是一个抽象的数据结构,它包含着类似于(键,值)的有序对。一个关联数组中的有序对可以重复(如C++中的 multimap)也可以不重复(如C++中的map)。
  • 这种数据结构包含以下几种常见的操作向关联数组添加配对从关联数组内删除配对修改关联数组内的配对根据已知的键寻找配对

5.完全公平调度器

  • 完全公平调度器(英语:Completely Fair Scheduler,缩写为CFS), Linux内核的一部分,负责进程调度。参考了康恩·科里瓦斯( Con Kolivas)提出的调度器源代码后,由匈牙利程式员英格·蒙内( ngo Molnar)所提出。在 Linux kernel2.6.23之后采用,取代先前的O(1)调度器,成为系统预设的调度器。它负责将CPU资源,分配给正在执行中的进程,目标在于最大化程式互动效能的同时,最小化整体CPU的运用。使用红黑树来实作,算法效率为O(log(n))

6.实时计算

  • 实时运算(Rea- time computing)是计算机科学中对受到“实时约束”的计算机硬件和计算机软件系统的硏究,实时约束像是从事件发生到系统回应之间的最长时间限制。实时程序必须保证在严格的时间限制内响应。通常实时回应时间会是以毫秒为单位,也有时是以微秒为单位。相比之下,非实时系统是一种无法保证在任何条件下,回应时间均匹配实时约束限制的系统。有可能大多数的情形下,非实时系统都可以匹配实时约束限制,甚至更快,只是无法保证在任何条件都可以匹配约束限制。
  • 在其他领域中也有用到“实时”这个词,但其含义不同:在仿真领域,实时是指“实时时钟同步”,此外在数据传输、多媒体处理和企业系统领域,实时意思是“感觉不到延迟”。
  • 实时软件必须使用一种或多种同步编程语言、实时操作系统以及创建在一个实时软件应用程序上的实时网络提供的基本框架

7.计算几何 

  • 计算几何是一门兴起于二十世纪七十年代末的计算机科学的一个分支,主要研究解决几何问题的算法。计算机的岀现使得一些问题大幅简化,然而一些人类直观自从1946年世界上第一台电子计算机问世以来,计算机应用的一个重要里程碑是1962年美国麻省理工学院发明了世界上第一台图形显示器。自此之后,计算机可以通过图形显示器直接输入、输出图形,并且可以在显示屏上通过光标的移动而直接修改图形。而在这之前,工程师是通过一厚叠纸上密密麻麻的数字来间接表达工程图形的。
  • 1962年被认为是美国和欧洲℃AD开始发展的一年。首先的应用领域是汽车、飞机和造船工业。这3个行业,由于其产品的外形曲面特别复杂,要求特别苛刻,而成为CAD首先应用的领域

之后还会补充其他关于红黑树的一些东西

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号