B树
一种平衡多路查找树:
平衡的意思就是左右子树高度差不超过1
多路查找就是有多条路径来查找
树中结点最大的孩子数目成为B树的阶。记为m
B树的性质
一颗m阶B树要么是空树,要么是满足以下特性的m叉树
*1*树中每个结点最多有m棵子树,最多有m-1个关键字。即棵子树夹着一个关键字
*2*若根节点不是终端结点,则最少有两个子树。即至少一个关键字
*3*除根结点之外的所有 非叶节点 至少有m/2棵子树,即至少m/2-1个关键字
*4*所有叶结点出现在同一个深度,不带信息。
非叶结点的结构
ki是关键字(递增),pi是子树根结点的指针
查找操作
根据关键字来查找,不赘述
插入操作
因为有关键字数量,平衡的限制,所以不可以像二叉搜索树那样找到终端结点位置插入。
其中很重要的操作:分裂,如果结点上的关键字数量大于m-1,则要进行分裂操作
分裂操作方法(两种情况):
>如果父结点是饱和的话:关键字数量等于m-1(性质1,最多有m-1个关键字)
把关键字数组中的中间关键字作为新结点,然后其他关键字形成两个结点作为左右孩子。
>如果父结点不饱和的话:可以把中间结点和父节点合并,之后处理之外的结点。
删除操作
分为在终端结点和非终端结点
删除终端结点:
①如果关键字数量>[m/2]-1, 直接删除
②如果关键字数量=[m/2]-1,并且兄弟结点中有关键字数量>[m/2]-1的结点,则去兄弟结点借关键字。
比如删除2
把兄弟结点的小关键字拿上去,与父结点换位,然后把2删除
③如果关键字数量=[m/2]-1,并且兄弟结点中没有关键字数量>[m/2]-1的结点,则需要进行结点合并
删除16
不可以直接删除16,因为删除之后不满足b树的定义
所以得进行合并。
上层取关键字与下层结点合并
方法不唯一,可以合并14-11或者20-22
删除非终端结点:
需要转换成在终端结点上,再按照终端结点来操作
相邻关键字:对于不在终端结点上的关键字,它的相邻关键字是其左子树中值最大的关键字或者右子树中值最小的关键字。
情况一:存在关键字数量大于[m-2]-1结点的左子树或者右子树
step1:
找出待删除关键字的相邻关键字
step2:
将这个待删除的关键字和某个相邻关键字互换,与9互换或者11都可以转化成删除终端结点
情况二:不存在关键字数量大于[m-2]-1结点的左子树或者右子树
比如14
则将左右子树合并,然后删除待删除的关键字
变成这样