B-树 B+树定义与简单的操作
B-树的定义
节点的孩子节点的最大数称为阶用m表示
所有的叶子节点在同一层,并且不带信息
每个节点最多含有m颗子树,最多含有m-1个关键字
根节点不是终端节点那么根节点至少有两个子树
除根节点以外其他非叶子节点至少有m/2向上取整个子树
每个非叶子节点的结构为:n,p0,k1,p1,k2,p2,k3,p3…kn,pn
其中n为关键字个数 m/2-1<n<m-1,ki为关键字ki<ki+1,pi为该节点的孩子节点的指针pi所指的节点的
关键字大于等于ki小于ki+1,pn所指的关键字大于kn
/** * @Author JH * @CreateDate 18-5-31 * @Description B-树实现 */
class Node{
int num;
int []key;
Node parent;
Node []child;
public Node(int m) {
this.key = new int[m];
this.child =new Node[m];
}
public Node(int num, int[] key, Node parent, Node[] child) {
this.num = num;
this.key = key;
this.parent = parent;
this.child = child;
}
}
class Result{
Node r;
int i;
int tag;
}
public class B_Tree {
public Result B_TreeSearch(Node root,int k){
Node p=root;
Node q=null;
Result r=new Result();
int i=0;
boolean find=false;
while (p!=null&&!find){//没有找到k或者p不为空
i=search(root,k);//返回k的位置
if (k==p.key[i]&&find==false){
find=true;
}else{//q记录k应该插入的节点
q=p;
p=p.child[i];
}
}
r.i=i;
if (find){
r.r=p;//查找成功则返回该节点
r.tag=1;
}else{//查找失败就返回k应该插入的节点的信息
r.r=q;
r.tag=0;
}return r;
}
public int search (Node root,int k){
int i=0;//找到关键字k在root的关键字中的位置 使得key[i]<k<key[i+1]
for(;i<root.num&&root.key[i+1]<=k;i++);
return i;
}
}
m阶B+树定义
每个分支至多有m棵子树
根节点没有子树或者至少有两颗
除了根节点其他节点至少有m/2向上取整个子树
有n棵子树的节点有n个关键字
叶子节点包含全部关键字,以及只想相应记录的指针,而叶子节点按关键字大小顺序链接( 每个叶子节点可以看成是一个基本索引块,它的指针指向数据文件中的记录)
所有分支节点(可以看成是索引的索引)中仅仅包含他的各个子节点中最大关键字以及指向子结点的指针