B-樹 B+樹定義與簡單的操作

B-樹 B+樹定義與簡單的操作


  1. 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]&lt;k&lt;key[i+1]
        for(;i&lt;root.num&&root.key[i+1]<=k;i++);
        return i;
    }
}
  • m階B+樹定義

    每個分支至多有m棵子樹

    根節點沒有子樹或者至少有兩顆

    除了根節點其他節點至少有m/2向上取整個子樹

    有n棵子樹的節點有n個關鍵字

    葉子節點包含全部關鍵字,以及只想相應記錄的指針,而葉子節點按關鍵字大小順序鏈接( 每個葉子節點可以看成是一個基本索引塊,它的指針指向數據文件中的記錄)

    所有分支節點(可以看成是索引的索引)中僅僅包含他的各個子節點中最大關鍵字以及指向子結點的指針

  • 發佈了91 篇原創文章 · 獲贊 4 · 訪問量 2萬+
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章