本来不想写2-3-4树的,因为它其实就是m=4的B-树。但2-3-4树不仅仅是m值最小的B-树,还因为它同构于红黑树。怎么个同构法?看看下面两棵树:
只需要把红黑树的红节点和父节点合并,那么红黑树就变成了B-树,也就是2-3-4树。结构上相同,是同构,那么操作上呢?这是个很有意思的话题。
插入的同构
不细讲红黑树和B-树在插入时的平衡策略。有些场景,2-3-4树不需要分裂但是红黑树需要旋转。对比下红黑树的变色过程和同构下的2-3-4树的分裂过程:
一对比,就发现这种变色就同构于2-3-4树的分裂。因为场景比较多,所以我写个表格,做个对比。出现这种结果的原因是,2-3-4树的最大key数组,同构于红黑树时要保证中间是黑色,两端是红色。
红黑树场景 | 红黑树操作 | B-树(2-3-4树)操作 |
---|---|---|
叔伯红色 | 着色 | 分裂 |
LL型伯父黑色 | 着色,右旋 | 不需要操作 |
LR型伯父黑色 | 左旋为LL型 | 不需要操作 |
RR型叔叔黑色 | 着色,左旋 | 不需要操作 |
RL型叔叔黑色 | 右旋为RR型 | 不需要操作 |
删除的同构
红黑树的删除是特别复杂的。B-树的删除也不简单。但是红黑树的七种删除场景虽然多。但是仔细整理还是可以理清楚的。我们可以发现,红黑树的删除,有替换的概念,而B-树的删除也有替换的概念。
红黑树场景 | 红黑树操作 | B-树(2-3-4树)操作 |
---|---|---|
哥哥是红色 | 着色,左旋 | 无变化 |
弟弟红色 | 着色,右旋 | 无变化 |
哥哥黑色,小侄子红色 | 着色,右旋 | 无变化 |
弟弟黑色,小侄子红色 | 着色,右旋 | 右移 |
哥哥黑色,大侄子红色 | 着色,左旋 | 左移 |
弟弟黑色,大侄子红色 | 着色,左旋 | 无变化 |
侄子全黑色 | 着色 | 无变化 |
可以看到2-3-4树的合并在这里是没有体现的。