二叉查找树不能保证树的平衡性,在最坏情况下,查找插入操作需要线性时间。
为了保证查找树的平衡性,有了2-3树的概念。
它是实现红黑树的基础。
2-3树中有两种结点:
- 2-结点(标准二叉查找树中的结点)
- 3-结点(两个键和3个链接)3-结点中左键<中键<右键
当插入结点时,通过一些基本操作,可以保证这棵树是完美平衡的,因此查找和插入的时间会是对数级的。
插入过程有如下几种可能性:
向2-结点中插入新键
当查找结束于一个2-结点,直接将此2-结点变为3-结点,并将键保存在其中。向一棵只含有3-结点的树中插入新键
先将它变为一个4-结点,然后将中键变为左右键的父结点,这样就变为3个2-结点。向一个父节点为2-结点的3-结点中插入新键
还是先将3-结点变为4-结点,将中键移至父结点中,使父节点变为一个3-结点。- 向一个父节点为3-结点的3-结点中插入新键
类似上一种情况,只不过父结点变成了4-结点,将4-结点分解为2个2-结点,中键继续向上传递。
局部变换不会影响树的全局有序性和平衡性,这是理解这个算法的关键。
为什么不直接用代码实现2-3树呢?
因为要有下面这些操作:
- 维护两种不同的结点(2-结点和3-结点)。
- 要将被查找的键和结点中每个键进行比较(如果是3-结点的话)。
- 将链接和其他信息从一个结点复制到另一个结点(中键向上传递和分解结点时)
- 将结点从一种数据类型转换为另一种数据类型。(2-结点3-结点相互转换)
这些操作产生的额外开销可能使算法比标准二叉查找树更慢。
为此,我们用红黑树来实现。