看不懂红黑树?打开红黑树的正确方式 2-3-4 四阶B树

    最近学习红黑树,被里面的红黑旋转绕的晕乎乎的,最大的问题就是很多人讲红黑树上来就告诉你红黑交换,然后旋转,旋转,旋转,为什么,不知道,后来接触到2-3-4树,即4阶B树,然后发现好多东西都有了概念,这里对B树做个简单描述,对于时间复杂度空间复杂度之类的不做研究,然后基于4阶B树在学习红黑树,会发现很多东西都变得有意思了。

B树定义

  先上百科:

  假如当前有一颗m阶的B树(注意阶的意思是指每个节点的孩子节点的个数),那么其符合:

  (1)每个节点最多有m个子节点

  (2)除了根节点和叶子节点之外,其他的每个节点最少有m/2(向上取整)个孩子节点

  (3)根节点至少有两个孩子节点,(除了第一次插入的时候,此时只有一个节点,根节点同时是叶子节点)

  (4)所有的叶子节点都在同一层

  (5)有k个子节点的父节点包含k-1个关键码  

  文字描述非脑袋,直接上图

  3阶B树

  4阶B树

  简单描述就是M阶B树允许一个节点最多有M个子节点,一个节点内有M-1个关键字,如上3阶B树,一个节点最多允许有3个子节点,允许有3-1=2个关键字(0002 0004),

  节点左边的子节点都比自己小,右边的子节点都比自己大,处于节点关键字区间内的(3阶B树的003,4阶B树的0003,0005)在下方。

 4阶B树(2-3-4树)

  因为需要通过4阶B树来了解红黑树,所以就不啰嗦3阶B树了,4阶B树,又叫2-3-4树,至于为什么叫2-3-4树,因为他下边最多可以挂2-3-4个子节点,具体解释度娘吧。

  4阶B树添加关键字的过程:所有的关键字都只能添加到叶子节点中,B树是向上生长的,即向叶子节点添加关键字,当叶子节点内关键字打到阶树时(即4阶B树节点内关键字达到4个时),叶子节点就会裂开,中间关键字上升到父节点,本身列为左右两个子节点,如下图

上图4阶B树的节点再添加关键字0004,因为超过了最大容量,节点会进行分裂,中间0002上升到父节点,没有父节点创造父节点,两边关键字变为左右子节点

关键字0004继续按规则添加到0003节点

4阶B树的关键字增加很好理解,就是按大小查找自己要增加在哪个子节点上,子节点满了就裂开,中间的关键字上升到父节点,父节点满了再继续裂开上升,所以说B树是向上生长的。如下图,继续增加关键字0010,通过查找,应该添加在0007 0008 0009叶结点中,但是这个节点满了,就会裂开,0008关键字上升到父节点,但是父节点也满了,父节点裂开,0004上升,

最终变为

不理解的可以参考 https://zhuanlan.zhihu.com/p/104030544

也可以在这里测试,查看动画效果 https://www.cs.usfca.edu/~galles/visualization/BTree.html

上边这个网站关键字插入和节点分裂的顺序问题,会导致乱序的数据生成的B树和自己想要的不一致(但是等效的,正确的),测试前先把测试数据按从小到大排序。

实际上按照节点满员后先分裂在插入的顺序手绘的就是理想的。

 

可以看出4阶B树增加节点的过程很简单,就是按照大小找到合适的叶子节点,插入,满了就裂开,父级满了就继续裂开。

4阶B树和红黑树的关系

随便编写几条数据进行测试,看看会生成什么样的

12,15,30,34,56,76,80,99

一个正常的4阶B树,出于简化编程或者是其他目的,我们把这个4阶B树进行转化,转为二叉树,转化原则就是所有关键字标为黑色,节点内有两个关键字的,加入晚的那个标红,有三个关键字的,两边的标红。就成了下边这个样子。

然后红色的转为子节点,即0015变为0034的左子节点,0076变为0034的右子节点,一次类推,

最终成了下面的样子

慢慢的都是惊喜,这就是一颗红黑树,而且是用上边测试数据生成的红黑树。

再按照红黑树的定义研究一下4阶B树和红黑树的关系。

还是百科:

性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3.所有叶子都是黑色。(叶子是NUIL节点)
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
 
性质1表示节点只有红色或者黑色,嗯---4阶B树我也只有红色和黑色,扯得上关系。
性质2表示根节点是黑色,4阶B树的红色标记定义为节点内有两个或者三个关键字的,旁边或者两边的关键字标红,转为子节点,所以4阶B树的根节点也一定是黑色。
性质3表示所有叶子节点都是黑色,实际上此处的叶子节点表示为在有效节点上增加的无意义的黑色NUIL节点,这个同样成立。
性质4表示每个红色节点的两个子节点都是黑色,不能有连续红色节点,参考性质2的定义,4阶B树变形的二叉树中红色节点的父节点一定是黑色,所以不会出现红色节点的子节点是红色,所以一定是黑色,自然也不存在连续红色节点,成立。
性质5表示从任意节点到叶子的所有最短路径包含相同数目的黑色节点,参考B树定义第四条,(4)所有的叶子节点都在同一层,二变形二叉树中的增加的层都是红色节点,黑色节点的位置没有变化,所以深度所有叶子节点的深度相同,路径包含黑色节点数量也相同,成立。
 
由上可以看出,变形的二叉树和红黑树是可以对应的,继续测试红黑树转为4阶B树。
随机数据生成红黑树
4,6,8,12,33,56,88,122,321
 
对红黑树进行反向处理,红色节点变为父节点的兄弟关键字,即0088和0321向上合并到0122,成为一个节点,0006和0056向上合并到0012,成为一个节点,最终为
实际上这和数据生成的4阶B树是一致的。
 

4阶B树与红黑树晋级

又上边大致推断出了4阶B树和红黑树的关系,此处不做详细研究确认,直接当作完全可行继续研究二者行为之间的关系。

红黑树操作参考:https://www.cnblogs.com/abatei/archive/2008/12/17/1356565.html

 

该睡觉了,先写个结论,有空再写,红黑树的各种旋转+变色同步与4阶B树的分裂,多次旋转同步与分裂后上升到父节点的关键字导致父节点超员后的父节点继续分裂,可以先把红黑树升阶为4阶B树,然后再进行添加节点,再降阶为红黑树,观察其中的变化。 

 

posted @ 2020-06-24 02:11  飞向狙沙  阅读(944)  评论(0编辑  收藏  举报