设B-树包含N个关键字,因此有N+1个叶子结点,叶子都在第I层。因为根至少有两个孩子,因此第二层至少有两个结点。除根和叶子外,其它结点至少有┌m/2┐个孩子,因此在第三层至少有2*┌m/2┐个结点,在第四层至少有2*(┌m/2┐^2)个结点,...,在第I层至少有2*(┌m/2┐^(l-2) )个结点,于是有:
当在
叶子结点处于第L+1层的B树中插入关键字时,被插入的关键字总是进入第L层的结点。
若在一个包含j
插入算法演示:插入之前如图1:
插入之后如图2:
4. B-树的删除:
当从B-树中删除一个关键字Ki时,总的分为以下两种情况:
如果该关键字所在的结点不是最下层的非叶子结点,则先需要把此关键字与它在B-树中后继对换位置,即以指针Pi所指子树中的最小关键字Y代替Ki,然后在相应的结点中删除Y。
如果该关键字所在的结点正好是最下层的非叶子结点,这种情况下,会有以下两种可能:
① 若该关键字Ki所在结点中的关键字个数不小于┌m/2┐,则可以直接从该结点中删除该关键字和相应指针即可。
② 若该关键字Ki所在结点中的关键字个数小于┌m/2┐,则直接从结点中删除关键字会导致此结点中所含关键字个数小于┌m/2┐-1 。这种情况下,需考察该结点在B树中的左或右兄弟结点,从兄弟结点中移若干个关键字到该结点中来(这也涉及它们的双亲结点中的一个关键字要作相应变化),使两个结点中所含关键字个数基本相同;但如果其兄弟结点的关键字个数也很少,刚好等于┌m/2┐-1 ,这种移动则不能进行,这种情形下,需要把删除了关键字Ki的结点、它的兄弟结点及它们双亲结点中的一个关键字合并为一个结点。