B树、B+树、B-树、B*树通俗解释,及B-树操作要点

B树:
    二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
B-树:
    平衡多路查找树,所有叶子结点在同一层。若根结点不是叶子结点,则至少有两棵子树。每个分支结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:
    在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;
    B+树总是到叶子结点才命中;
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;



B-树插入:
(1)如果该结点的关键字个数没有到达2个,那么直接插入即可; 
(2)如果该结点的关键字个数已经到达了2个,那么根据B树的性质显然无法满足,需要将其进行分裂。
    分裂的规则是该结点分成两半,将中间的关键字进行提升,加入到父亲结点中,但是这又可能存在父亲结点也满员的情况,则不得不向上进行回溯,甚至是要对根结点进行分裂,那么整棵树都加了一层。
B-树删除:
(1)所删关键码为非终端结点中Ki:
    用指针Ai所指子树中最小关键码Y代替Ki,然后在相应终端结点中删去Y,转为删除终端结点中的关键码的问题。
(2)删除终端节点中关键码:
    a.被删关键码所在结点中的关键码个数>=[m/2],说明删去该关键字后该结点仍满足B-树的定义。这种情况最为简单,只需从该结点中直接删去关键字即可。
    b.被删关键码所在结点中关键码个数n=[m/2]-1,说明删去该关键字后该结点将不满足B-树的定义,需要调整:如果其相邻的左右兄弟结点中有“多余”的关键字,即关键字数目大于[m/2]-1,则可将右()兄弟结点中最小()关键字上移至双亲结点。而将双亲结点中小()于该上移关键字的最大()关键字下移至被删关键字所在结点中。
    c.被删关键码所在结点和其相邻的左右兄弟节点中的关键码个数均等于[m/2]-1,左右兄弟都不够借。需要调整:将要删除关键字结点的父结点中关键字合并到左(或右)兄弟结点中去。如果因此使双亲结点中关键字个数小于[m/2]-1,
    则对此双亲结点做同样处理。以致于可能直到对根结点做这样的处理而使整个树减少一层。

你可能感兴趣的:(经验)