7.8.1 带你学习红黑树(1)

继续学习二叉搜索树相关知识,我们来认识一下略高级的数据结构——红黑树。

鄙人在此仍然提供一些博客,并整理主要知识点及学习路线,由浅入深认识,觉得自己需要掌握到什么地步,适可而止。

  1.  红黑树的特点和主要性质
  2.  红黑树结点的插入和删除
  3.  由2-3-4树理解红黑树
  4.  python 手撕红黑树

推荐的文章又是July大神的系列文章,我会在下面的总结中捋一下怎么看:

1、教你透彻了解红黑树

2、红黑树算法的实现与剖析

3、红黑树的c源码实现与剖析

4、一步一图一代码,R-B Tree

5、红黑树插入和删除结点的全程演示

6、红黑树的c++完整实现源码

7. 从2-3-4树谈到Red-Black Tree(红黑树)


一、红黑树(R-B Tree)的特点和主要性质

首先,认识红黑树的基础是BST的基础知识,不熟悉的先补一下基础。

然后,红黑树仍然是一种平衡的二分查找树,不同于AVL,它没有用平衡因子来控制树的平衡(平衡树可以通过结点的平衡因子来定义,因此,AVL实际上是直接用定义来平衡的),红黑树通过定义了结点的另一属性颜色,控制了树的平衡, 保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。

我们来看一下老生常谈的红黑树的5个性质:

  1. 每个结点要么是红的要么是黑的。  
  2. 根结点是黑的。  
  3. 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  
  4. 如果一个结点是红的,那么它的两个儿子都是黑的。  
  5.  对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。 

 

7.8.1 带你学习红黑树(1)_第1张图片

 谈谈这几条性质,都是告诉我们,它是什么样的,而没有说明为什么是这样的,尤其是第5条。我们先通过上图来看一下前4个性质。

然后看第5条,也可以看出,第5条性质是红黑树作为平衡的二分查找树,应该具有的性质,保证各路径深度一致,查找等操作的时间复杂度一致。但是每条路径包含的黑结点数目相同?听起来怪怪的。这说明,结点的颜色,必然有它的深刻意义。

作为初步的认知,就到这儿了,可以达到知其然的阶段。

 

二、红黑树结点的插入和删除

平衡二叉树中,结点插入,少不了又要调整一番。

红黑树的结点插入,也要先了解AVL中结点左旋、右旋那一套理论,不熟悉的补一下,当然第一篇博客中也有介绍。

July大神对红黑树的操作反反复复进行了讲解,可谓细致。鄙人以为,这部分的理解,看第4/5博客即可 一步一图一代码,R-B Tree , 红黑树插入和删除结点的全程演示。在我们有AVL平衡调整的认识的基础上,红黑树插入结点后,无非也是各种失衡的情况,针对不同情况进行调整。

我们看博客5,总结了结点插入的5种情形:

7.8.1 带你学习红黑树(1)_第2张图片

其中,后三种是失衡状态,需要调整,他们有个共同点就是,父结点红色的。 

此时我们来看博客4,针对这5种情形和3种失衡,一步一步举例子说明,出码。如下图是情形3-5的。在失衡调整时,要追溯到祖父结点,还要认识一下叔叔结点,调整他们的颜色,连接关系等。从总体来看,我们这样大概就掌握了红黑树结点插入的规则,全流程的图可以参考博客5,但是也没有旋转等中间流程,但是仍然是珍贵的学习材料。

7.8.1 带你学习红黑树(1)_第3张图片7.8.1 带你学习红黑树(1)_第4张图片7.8.1 带你学习红黑树(1)_第5张图片

 下面是结点删除的6种情形,鄙人也没细看。。

7.8.1 带你学习红黑树(1)_第6张图片

不喜欢学习删除结点的操作。。看似也很复杂。

博客4最后总结了红黑树的时间复杂度分析,作为一棵二叉查找树,查找操作简单,复杂度仍然是O(log n);插入和删除看似复杂(就是复杂嘛)时间复杂度也是O(log n)的,插入最多2次树的旋转,删除最多3次,还有路径上结点颜色的变更。

 

三、由2-3-4树理解红黑树

咦?红黑树不是学完了么,要学的都在前面了啊。

在死记硬背中,给你灌入了红黑树的性质和各种操作,你就忘了其实你并不理解他是怎么回事:

  • 结点的红色黑色究竟是什么含义
  • 或者说,我们是如何应用结点的颜色的关系(在插入、删除结点而失衡时),通过各种调整手段,使树重新平衡的?

你没有发现,我们在判断是否失衡时、在调整时,根本不用判断该结点左右子树的高度差么?我们通过父、叔、祖父的情况,就全知道了。维护红黑树的第5条性质,就是保持树的平衡,这究竟是怎么回事。

带着问题,我们来看2-3-4树。首先抛给你一个结论:红黑树是与2-3-4树等价的数据结构

2-3-4 树是紅黑树结构的一种等同,这意味着它们是等价的数据结构。换句话说,对于每个 2-3-4 树,都存在着至少一个数据元素是相同次序的红黑树。在 2-3-4 树上的插入和删除操作也等价于在红黑树中的颜色翻转和旋转。这使得它成为理解红黑树背后的逻辑的重要工具。

带着这个结论来看博客7 从2-3-4树谈到Red-Black Tree(红黑树)

2-3-4树就是前面介绍的B树,是4阶B树,应该是最简单的B树了吧,毕竟m<4的树没有价值。接下来大家进入博客,自行了解2-3-4树的性质,包括结点插入的操作中结点分裂的情形。详细了解2-3-4树可以看2-3-4树的java实现。

7.8.1 带你学习红黑树(1)_第7张图片

认识了2-3-4树后,我们回到红黑树。学习要点分为两部分:

  • 红黑树与2-3-4树等价性的认识 :理解结点颜色的含义,红色的边指向的结点为红色。

  • 红黑树的左旋、右旋操作情况中与2-3-4树相应情形的对应关系:理解失衡调整的几种情形的意义,理解红黑树中是如何借助颜色关系,控制树的平衡的。

7.8.1 带你学习红黑树(1)_第8张图片


本文主要是学习路线和理解红黑树的思路,学习深浅靠自行把握,看大神的博客;理解多深靠自我感悟了,鄙人也没写的很深入。

至于python代码手撕红黑树什么的,有时间再更下一篇。

 

你可能感兴趣的:(python数据结构与算法,红黑树,插入,二分搜索树)