多路查找树 B-Tree

B树和B+树


普通树,一个节点只能存储一个元素,在元素非常多的时候,就使得要么树的度非常大,要么树的高度非常大,甚至两者都必须足够大才行。显然,访问的时候使得内存存取次数非常多,是时间效率上的瓶颈。

定义

多路查找树(multi-way search trees),其每一个节点的孩子数可以多于两个,且每一个节点处可以存储多个元素。由于它是查找树,所有的元素之间存在某种特定的排序关系。
常见的四种特殊形式:2-3树,2-3-4树,B树,B+树。

2-3树

2-3树特点:树中每一个节点都具有两个孩子或三个孩子,不存在其他目的孩子(叶子没有孩子);所有叶子位于同一层次上。比如:一个2节点包含一个元素和两个孩子,不能只有一个孩子,可以没有孩子,其中,左子树小于该元素,右子树大于该元素。一个3节点包含一大一小两个元素和三个孩子(也可以没有孩子,但不可以是其他数目的孩子),左子树小于较小的元素,中子树介于较小和大元素之间,右子树大于较大元素。

2-3树复杂之处在于新节点的插入和已有节点的删除。因为,要保证操作后还是有效的2-3树。而每个节点也有可能是2节点也可能是3节点,要保证所有叶子节点都在同一层次上。
例如:一颗2-3树,插入一个节点。
在这里插入图片描述
对左侧2-3树插入一个3,首先,根据遍历,3比8小,比4小,于是只能考虑插入到叶子节点1所在的位置,考虑到所有叶子节点都在同一层,就将1位置变成3节点。

如果向2-3树中3节点插入元素,则有几种情况。
在这里插入图片描述
一是,向6 7这个三节点插入5,将三节点拆分,让双亲变成三节点,5成为中孩子,7成为右孩子。
在这里插入图片描述
二是,双亲本来是三节点,如:向2-3树中插入11,只能往双亲的双亲上转移,将12转移到8的位置构成三节点,原双亲的左子树变成新三节点的中子树(三节点叶子变成左右孩子),原双亲剩下的较大元素构成新三节点的右子树。
在这里插入图片描述
三是,在2-3树上插入2,但此时1 3节点,4 6节点,8 12节点都已经是三节点了。
这就表示,当前的树结构不满足需要,需要增加一层。但所有叶子节点都必须在同一层。所以根节点会有如此变化。将1 3 拆分,4 6 拆分,8 12拆分。
最终如右图所示。1 3 拆分,2插入为子根节点,3为右孩子;4 6拆分,4为子根节点,2子树为左孩子,6为右子树,5为6的左叶子,7为右叶子。8 12 拆分,8为根节点,4为左子树,12为右子树,10为12的左子树,14为12的右子树。通过拆分操作,整个树长高一层。
按照有效2-3树的特征,删除节点也可同样推理。

2-3-4树

未完待续……
B-tree

猜你喜欢

转载自blog.csdn.net/beauthy/article/details/105585777