B树的生成
flyfish 2015-7-19
从空树开始构建一棵B树 逐个插入关键字
规则:
除根结点之外的所有非终端结点至少有
⌈m/2⌉
棵子树,所以关键字的个数必须 n为关键字个数
⌈m/2⌉-1
⩽
n。
按照A0,K1,A1,K2,A2,…,Kn,An
也就是指针个数比关键字个数多一个
因为树中每个结点至多有m 棵子树,所以该结点的关键字个数不能超过m-1
也就是,关键字个数的阈值 ⌈m/2⌉−1 ⩽n ⩽m−1
每次插入一个关键字不是在树中添加一个叶子结点,因为这样不再是有效的B树而是首先在最低层的某个非终端结点中添加一个关键字,若该结点的关键字个数不超过m-1,则插入完成,否则要产生结点的“分裂”
绿色:关键字个数
红色:指针
蓝色:关键字
构建Degree为3关键字从1到7的B树
一般情况下,结点可如下实现分裂 引用自严蔚敏《数据结构》
假设*p结点中已有m-1个关键字,当插入一个关键字之后,结点中含有信息为:
(m, A0 ,( K1 , A1 ),…,( Km , Am )
且其中 Ki < Ki + 1 , 1 ⩽ i< m
此时可将*P节点分裂为*P和*P’两个结点,
*p结点中含有信息
⌈m/2⌉ -1, A0 ,( K1 , A1 ),…,( K⌈m/2⌉ − 1 , A⌈m/2⌉ − 1 )
*p’结点中含有信息
m- ⌈m/2⌉ , A⌈m/2⌉ ,( K⌈m/2⌉ + 1 , A⌈m/2⌉ + 1 ),… ,( Km , Am )
而关键字K ⌈m/2⌉ 和指针*p’一起插入到*p的双亲结点中.
简化理解
m为B树的阶,n为节点的个数
若在一个包含 n<m−1 个关键字的结点中插入一个新的关键字,则把新的关键字直接插入该结点即可;
但若把一个新的关键字插入到包含m-1个关键字的结点中,则将引起结点的分裂。
生成一新结点,把原结点上的关键字K按升序排序,也就是
Ki
<
Ki
+
1
,
满足:左边的小于中间的关键字;右边的大于中间的关键字,从中间位置把关键字(不包括中间位置的关键字)分成两部分。
左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置(指向新节点的指针)插入到双亲结点中。如果双亲结点的关键字个数也超过m-1,则要再分裂,再往上插入,此时B树可能朝着根的方向生长。