思维导图:
B树的定义:
n:关键字的个数,由B树定义可知,m/2-1取上界 <= n <= m-1
p:指向子树的指针
k:关键字
例:
ps: 这是一颗三阶的树,所以每个节点最多只能有3颗子树
ps: 本质上是绝对平衡,即左右子树高度差为0
ps: 3/2取上界为2,即每个非叶节点至少有2颗子树
ps:
节点的关键字必须按从小到大的顺序排序
每个节点左子树的关键字小于该节点关键字,右子树大于该节点关键字
n个关键字,阶数为m,高度为h的B树的高度计算
最小高度:
ps:
h最小的时候就是每层节点数都取最大的时候,就是满二叉树的时候
所以总的节点个数为后面括号所示
又每个节点的关健字最大为m-1个
所以乘起来即为最大的关键字数
最大高度:
ps:
h最小的时候就是每层节点数都取最小的时候
第一层的关键字个数最小为1,则第二层的子树为2,即第二层有俩个节点
每个节点的最小关键字为m/2取下界个,所以第二层总关键字数为2倍的m/2取下界个
以此类推,第h层总关键字数为2倍的(m/2取下界)的h-1次幂
又一个节点对应一个关键字(最小)且第h层为查找失败节点个数 = 查找成功节点个数 + 1 = n+1
基本操作:
查找:
ps: 查找32
因为18<32<33,所以查找关键字18右边、33左边的子树,即23、30这个节点的子树
又30<32,所以查找关键字30右边的子树,即3、32这个节点的子树
查找成功,找到32
插入:
例:
初始:
插入:
分裂:(这是一颗三阶数,所以每个节点的关键字最大为2,19、20、21不满足,所以分裂)
在分裂:
在分裂:
删除:
对终端节点的删除:
例1: (兄弟够借的情况)
初始:
从左兄弟借:
或者从右兄弟借:(原理相同)
例2:(兄弟不够借的情况)
初始:
合并:
对非终端节点的删除:
例1:
初始:
删除:(用左子树最右侧的关键字替换,然后删除被替换的节点)
例2:
初始:
删除:(用右子树最左侧的关键字替换,然后删除被替换的节点)
例3:
初始:
删除: