看不懂红黑树?打开红黑树的正确方式 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树和红黑树的关系。
还是百科:
4阶B树与红黑树晋级
又上边大致推断出了4阶B树和红黑树的关系,此处不做详细研究确认,直接当作完全可行继续研究二者行为之间的关系。
红黑树操作参考:https://www.cnblogs.com/abatei/archive/2008/12/17/1356565.html
该睡觉了,先写个结论,有空再写,红黑树的各种旋转+变色同步与4阶B树的分裂,多次旋转同步与分裂后上升到父节点的关键字导致父节点超员后的父节点继续分裂,可以先把红黑树升阶为4阶B树,然后再进行添加节点,再降阶为红黑树,观察其中的变化。