234树的由来及其红黑树

1,746 阅读3分钟

234树的由来及其红黑树

这是我参与更文挑战的第19天,活动详情查看:更文挑战

234树

前面我们了解了如何将一颗不平衡二叉树变成平衡二叉树,那么平衡二叉树的性能还能再优化吗,答案是可以的。首先前面我们讲了了要优化二次搜索树就是要将它的层级变少,它的层级越少,那么它的查找效率越高。优化平衡二叉树也是如此。而且如果一个节点能存的给数,那么可以提升它的空间性能。
那么怎么才能让二叉平衡排序树的层数变少呢?如果不是二叉树,层数会更少,因为二叉平衡排序树只能有两个叉,导致在节点铺满的时候也会有很多层。
树的叉越多,层数越少,但是它的叉越多,树的结构就越复杂。所以我们要优化的时候要取一个比较平衡的点,让它的叉不会太多,层次也更少。研究发现阶为4时,性能较好,所以有了234树。
它的每个节点最多有四个子节点和三个数据项。
插入时,插入的值落到最底层作为叶子节点,在查找插入的位置的时候如果遇到节点数据项满了的情况,需要进行节点分裂。
节点分裂,中间元素冒泡上浮到父节点 左右元素断裂成两个节点,然后插入的元素继续向下进行寻找适合插入的地方

批注 2021-06-20 010407.png 如上图,一个节点有三个数据,然后现在我们要再插入一个40

批注 2021-06-20 010808.png 中间元素50冒泡上浮到父节点,左右元素断裂成两个节点,插入的元素40比50小,比30大,就插入到30后面。再插入45,90,100.

批注 2021-06-20 011626.png 就变成这样,如果再插入一个120

批注 2021-06-20 011912.png 因为右边的节点已经满了,中间元素90冒泡上浮到父节点,90比50大,插入到50后面。左右元素断裂成两个节点,80比50大比90小,所以它在它们中间,100,120比50,90大,在它们右边
我们可以发现,234树的子节点永远在最后一层
234树永远是平衡的(每一个路径的高度都相同)

我们可以看到234树实现了我们想要的效果,分支变多了,层数变少了,节点存的数变多了,节点变少了。但是因为分支多了,所以复杂度上升了。
那么我们能不能简化234树呢?例如我们希望能简化成一个二叉树,但是依然保留多叉和单节点保存多个值的特性。所以出现了红黑树。

红黑树

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。
首先,红黑树是一颗二叉查找树,另外,它还必须满足以下五点要求:
1.节点是红色或黑色;
2.根节点是黑色;
3.所有叶子节点是黑色;(叶子节点是NULL节点)
4.每个红色节点的两个子节点都是黑色;(从根节点到每个叶子节点的路径上不能有两个连续的红节点)
5.从任何一个节点到每个叶子节点的所有路径都包含相同数目的黑色节点;

批注 2021-06-20 023855.png 如图,我们怎么把上图变成红黑树呢?

批注 2021-06-20 030431.png 首先根据特性2,根节点40是黑色的,假如我们先将50,90都变成红色的,来表示三叉,但是我们发现违反了特性4,那么我们改变一下

批注 2021-06-20 023911.png 就成功让其变成红黑树。