您的位置:首页 > 其它

B树的生成

2015-07-19 19:56 267 查看
B树的生成

flyfish 2015-7-19

从空树开始构建一棵B树 逐个插入关键字

规则:

除根结点之外的所有非终端结点至少有⌈m/2⌉\left \lceil m/2 \right \rceil棵子树,所以关键字的个数必须 n为关键字个数

⌈m/2⌉-1⩽\leqslant n。

按照A0,K1,A1,K2,A2,…,Kn,An

也就是指针个数比关键字个数多一个

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

也就是,关键字个数的阈值 ⌈m/2⌉−1 \left \lceil m/2 \right \rceil-1⩽n\leqslant n⩽m−1\leqslant m-1

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

绿色:关键字个数

红色:指针

蓝色:关键字

构建Degree为3关键字从1到7的B树



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

假设*p结点中已有m-1个关键字,当插入一个关键字之后,结点中含有信息为:

(m,A0A_0,(K1K_1,A1A_1),…,(KmK_m,AmA_m)

且其中 KiK_i<KiK_i +_+1_1 , 1⩽\leqslanti< m

此时可将*P节点分裂为*P和*P’两个结点,

*p结点中含有信息

⌈m/2⌉\left \lceil m/2 \right \rceil-1,A0A_0,(K1K_1,A1A_1),…,(K⌈m/2⌉K_\left \lceil m/2 \right \rceil−_-1_1,A⌈m/2⌉A_\left \lceil m/2 \right \rceil−_-1_1)

*p’结点中含有信息

m-⌈m/2⌉\left \lceil m/2 \right \rceil,A⌈m/2⌉A_\left \lceil m/2 \right \rceil,(K⌈m/2⌉K_\left \lceil m/2 \right \rceil+_+1_1,A⌈m/2⌉A_\left \lceil m/2 \right \rceil+_+1_1 ),… ,(KmK_m,AmA_m)

而关键字K⌈m/2⌉_\left \lceil m/2 \right \rceil和指针*p’一起插入到*p的双亲结点中.

简化理解

m为B树的阶,n为节点的个数

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

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

生成一新结点,把原结点上的关键字K按升序排序,也就是 KiK_i<KiK_i +_+1_1 ,

满足:左边的小于中间的关键字;右边的大于中间的关键字,从中间位置把关键字(不包括中间位置的关键字)分成两部分。

左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置(指向新节点的指针)插入到双亲结点中。如果双亲结点的关键字个数也超过m-1,则要再分裂,再往上插入,此时B树可能朝着根的方向生长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: