## 定义 ##
任何和关键字相联系的“卫星数据”将与关键字一样存放在同一个节点中。
## 性质 ##
## B树的高度 ##
B树上大部分的操作所需的磁盘存取次数与B树高度成正比。
## B树上的基本操作 ##
搜索B树
B-TREE-SEARCH(x,k)
{
int i=1;
while(i<=x.n&&k>x.keyi)
i=i+1;
if(i<=x.n&&k==x.key)
{
return (x,i);
}
else
if(x.leaf)
{
return NULL;
}
esle
{
DISK-READ(x,c);
}
return B-TREE-SEARCH(X.Ci,K);
}
## 创建一个空的B树 ##
为构造一个B树T,先用G-TREE-CREATE来创建一个空的根节点,然后调用B-TREE-INSERT来添加新的关键字。然而这些过程都要用到一个辅助过程ALLOCATE-NODE,它在O(1)时间内为一个新节点分配一个磁盘页。我们假定由ALLOCATE-NODE所创建的节点并不需要DISK-READ,因为磁盘上还没有关于该节点的有用信息。
## 向B树中插入一个关键字 ##
在B树中我们不能简单地创建一个新的页节点,然后将其插入,因为这样的得到的不再是合法的B树,相反,我们是将新的关键字插入已经存在的页节点上。由于不能将关键字插入一个满的叶节点,故引入一个操作,见一个满的节点Y (有2*T-1个关键字)按其中间关键字Y.key分裂为各含T-1个关键字的节点。中间关键字被提升到Y的父节点,以标识两棵新树划分点。但是如果Y的父节点也是满的,就必须在插入新的关键字之前将其分裂,最终满节点的分裂会沿着树向上传播。
## 分裂B树的节点 ##
## 伪代码解释 ##
B-TREE-SPLIT-CHILD以直接的“剪贴”方式工作,这里X是被分裂的节点,Y是X的第i个孩子,开始时,节点Y有2T个孩子(2T-1个关键字),再分裂后减少至T个孩子(t-1个关键字),并且Z成为X的新孩子,它在X的孩子表中仅仅位于Y之后。Y的关键字上升到X中,他成为分割Y和Z的关键字。