本代码为参考算法导论所写,主要记录B树数据结构的实现原理及方式。
本代码主要实现了B树的插入和删除的操作过程。详细注释了插入分裂,删除合并的逻辑规则。
本代码未讲过仔细的调试和详尽的测试,但可以作为学习和研究B树结构原理,实现方式的参考。
package tree;
/**
* B树特征
* 每个节点必须包含 t-1 -> 2t-1个key,t>=2。根节点可以只有1个key. t被称为最小度数
* 每个节点需包含 t -> 2t个子节点指针。 这样保证了树至少为2叉的。
* 每个节点的关键字以非降序排序
* 每个叶节点具有相同的深度,所以是平衡的。树高为 h <= logt((n+1)/2), n为树的总关键字数,
*
* B树操作
* B树通过插入的分裂,删除的合并来保证树一直满足B树的特征。
* 当插入时,由于子节已满,需要分裂成两个子节点,每个子节点含有t-1个关键字,并在父节点中插入原节点中间值
* 在插入过程中,从根节点向下递归查找时就要确保根节点,及递归时的子节点为非满的,否则进行跟/子节点分裂。
* 由于分裂操作,并不会影响每个节点的树高,只有在跟节点进行分裂的时候树高才加1,子节点高度依次增加,所以B树总是平衡的。
*
* 在删除过程中,可以分为两种情况
* 1. 删除的为叶子节点关键字。
* 如果叶子节点关键字数量大于t-1,则直接删除即可。
* 如果不足t-1则需要从父节点移动关键字下来,然后递归删除父节点关键字。
*
* 2. 删除的为内部节点关键字。
* 如果相邻两个子节点有一个具有大于t-1的关键字,则直接从该节点移动关键字上来填充即可。然后向下递归删除子节点关键字
* 如果相邻两个子节点都只有t-1个关键字,则操作子节点进行合并。然后删除父节点关键字。如果由于删除父节点关键字导致关键字数量不足t-1,
* 则需要继续从祖节点移动关键字下来,然后递归删除祖节点相应关键字。
*
* 从删除操作看,删除操作可能在树中不断向下递归移动关键字到父节点,或者向上回溯移动关键字到子节点。但每步操作后都符合B树的特征,
* 并在这个过程中使得相关子节点合并为2t-2个关键字的新节点。
*
*
* B+树特征
* B树的变种,在非叶子节点不能存储关键字的值,所有数据存储在叶子节点,因此最大化了内部节点的分支因子
* 由于B树删除内部节点的复杂性,需要向下递归移动关键字,同时可能向上回溯进行合并
* 所以B+树将所有关键字数据放在叶子节点能最大化删除操作的性能,直接找到某个叶子节点进行删除,然后回溯合并即可。
*
* B树的用处
* B树也是一个排序树,其较平衡二叉树有更多的分支,所以B树有更小的树高,看起来更扁平,从而减少了从根节点开始的查找次数
* B树常用于对磁盘文件的索引。由于访问一次节点就需要进行一次磁盘I/O