B树的生成

B树的生成
flyfish 2015-7-19
从空树开始构建一棵B树 逐个插入关键字

规则:

除根结点之外的所有非终端结点至少有 m/2 棵子树,所以关键字的个数必须 n为关键字个数
⌈m/2⌉-1 n。
按照A0,K1,A1,K2,A2,…,Kn,An
也就是指针个数比关键字个数多一个

因为树中每个结点至多有m 棵子树,所以该结点的关键字个数不能超过m-1

也就是,关键字个数的阈值 m/21 n m1

每次插入一个关键字不是在树中添加一个叶子结点,因为这样不再是有效的B树而是首先在最低层的某个非终端结点中添加一个关键字,若该结点的关键字个数不超过m-1,则插入完成,否则要产生结点的“分裂”

绿色:关键字个数
红色:指针
蓝色:关键字
构建Degree为3关键字从1到7的B树

B树的生成_第1张图片

一般情况下,结点可如下实现分裂 引用自严蔚敏《数据结构》

假设*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 ),…,( Km/2 1 Am/2 1 )

*p’结点中含有信息

m- m/2 Am/2 ,( Km/2 + 1 Am/2 + 1 ),… ,( Km Am )

而关键字K m/2 和指针*p’一起插入到*p的双亲结点中.

简化理解
m为B树的阶,n为节点的个数

若在一个包含 n<m1 个关键字的结点中插入一个新的关键字,则把新的关键字直接插入该结点即可;

但若把一个新的关键字插入到包含m-1个关键字的结点中,则将引起结点的分裂。

生成一新结点,把原结点上的关键字K按升序排序,也就是 Ki < Ki + 1
满足:左边的小于中间的关键字;右边的大于中间的关键字,从中间位置把关键字(不包括中间位置的关键字)分成两部分。

左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置(指向新节点的指针)插入到双亲结点中。如果双亲结点的关键字个数也超过m-1,则要再分裂,再往上插入,此时B树可能朝着根的方向生长。

你可能感兴趣的:(数据结构与算法设计)