你心里有没有点B树?
1. 概念
B树,是一种多路平衡搜索树,多用于文件系统、数据库的实现。B树中所有节点拥有的子节点数(指针数)
的最大值称为B树的阶,如3阶B树他的子节点个数最大为3个。
可以通过这个可视化数据结构网站自己对照模拟一遍,会更容易掌握的。选择B Trees,就可以进入到页面创建B树了,选择相应的阶数即可。点这里,进入可视化数据结构网站
2. B树的特点
B树有以下特点:
1.
每个节点可以存储多个元素(n)
、可以拥有多个子节点(n + 1)
;
2.
拥有二叉树的一些性质,元素都是有序的;
3.
极度平衡,每个节点的所有子树的高度一致;
4.
整个树的高度非常矮,存储元素个数也非常多;
3. B树的性质
m阶B数的性质:
1.
m阶B树满足以下性质;
2.
根节点的元素个数必须1 <= x <= m - 1
;
3.
非根节点的元素个数必须为┌ m / 2 ┐ - 1 <= x <= m - 1 (┌ ┐向上取整)
;
4.
如果一个节点中的元素个数为x
,并且有子节点,那么子节点个数为y = x + 1
那么作为根节点的子节点个数为2 <= y <= m
,作为非根节点的子节点个数为┌ m / 2 ┐ <= y <= m
;
4. B树的节点搜索操作
B树的搜索步骤和二叉搜索树类似:
1.
先从节点内从小到大开始搜索元素;
2.
如果命中,搜索结束;
3.
如果未命中,在去对应的子节点中搜索元素,重复1,2步骤;
5. B树的节点添加操作
B树的添加,新添加的元素必定是添加到叶子节点上,如果叶子节点上的元素个数满足m阶B树的性质,那么就符合条件无需处理。但是如果插入到叶子节点上的个数超过B树的阶数,那么需要进行上溢处理。
上溢解决(上溢节点的个数必定等于m):
1.
找出产生上溢的那个节点最中间的位置的元素b;
2.
将b位置的元素向上与父节点进行合并;
3.
然后将[0,b - 1]
和[b + 1,m]
位置的元素分裂成两个子节点,作为上溢元素的左右子节点;
4.
检查父节点是否发生上溢,如果父节点发生上溢,那么执行1,2,3
步骤,直到上溢问题解决;
6. B树的节点删除操作
B树的删除操作,如果删除的元素在叶子节点,那么直接删除即可。如果删除元素在非叶子节点,那么需要以下步骤:
1.
先找到他的前驱或后继元素,覆盖所需要删除的元素值;
2.
在把前驱或后继元素删除;
由此可知,不管是叶子节点删除,还是非叶子节点删除。真正的删除元素都是发生在叶子节点上。如果在删除叶子节点的时候,节点的元素数量为┌ m / 2 ┐ - 1
,那么需要进行下溢操作,下溢节点的元素数量必然等于┌ m / 2 ┐ - 2
.
下溢解决:
1.
如果下溢节点临近的兄弟节点,有至少┌ m / 2 ┐
个元素,可以向其借一个元素a,然后将其父节点的元素b插入到下溢节点的0位置,把元素a替换到父节点元素b的位置 (旋转操作);
2.
如果临近的兄弟节点,只有 ┌ m / 2 ┐ - 1
个元素,那么将父节点的元素b挪下来跟左右子节点进行合并,并且非常巧妙的是合并的元素个数为┌ m / 2 ┐ + ┌ m / 2 ┐ - 2
不会超过m - 1
,这个操作可能会导致父节点产生下溢 ,然后尝试执行1,2步操作。