??1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:
??1、根结点至少有两个子女;
??2、每个非根节点所包含的关键字个数 j 满足:? m/2? - 1 <= j <= m - 1;
??3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:? m/2? <= k <= m ;
??4、所有的叶子结点都位于同一层。
??在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。
??因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。
??B-树中的一个包含n个关键字,n+1个指针的结点的一般形式为:(n,P0,K1,P1,K2,P2,…,Kn,Pn)。其中,Ki为关键字,K1<K2<…<Kn, Pi 是指向包括Ki到Ki+1之间的关键字的子树的指针。
??------粘百度百科
??网址是:https://www.cs.usfca.edu/~galles/visualization/BTree.html
??看一个具体例子,这里是以五阶B树为例,
??对于五阶B树来说:
????其中根结点的关键字个数 j 满足:1 <= j <= m - 1,也就是1 ~ 4;
????其中非根结点的关键字个数 j 满足:? m/2? - 1 <= j <= m - 1,也就是2 ~ 4;
????其中根结点的子树个数 k 满足:2 <= j <= m ,也就是2 ~ 5;
????其中子结点的子树个数 k 满足:? m/2? <= k <= m,也就是3 ~ 5。
??关键字序列为(1,2,3,4,5,6,9,11,12,23,25,30,40,43,44,46,48,49,50,51,52,56,58,59,60,64,65,66,70,72,73,89),其中绿色的图是在线可视化生成B树工具运行结果。
??1、B树插入这里不介绍,构建完成后如图4-1所示。
??2、删除关键字“60”,删除后如图4-2所示。
??图中步骤②,是根据B树删除规则中第①个【先用其直接前驱(关键字“59”(替代是先左后右))替代其位置】
??图中步骤③,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“58”)需要与父结点内的关键字(关键字是“56”)和左兄弟(关键字是“51、52”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数未低过下限(五阶B树非根结点的关键字个数下限是2),无需继续调整合并】
??3、删除关键字“66”,删除后如图4-3所示。
??图中步骤②,根据B树删除规则中第①个【先用其直接前驱(关键字“65”(替代是先左后右))替代其位置】
??图中步骤③和步骤④,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“59”)、前驱的前驱(关键字是“58”)依次顶替空缺】
??4、删除关键字“65”,删除后如图4-4所示。
??图中步骤②,根据B树删除规则中第①个【先用其直接前驱(关键字“64”(替代是先左后右))替代其位置】
??图中步骤③和步骤④,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“58”)、前驱的前驱(关键字是“56”)依次顶替空缺】
??图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“64”)、后继的后继(关键字是“70”)依次顶替空缺】
??图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“70”)、后继的后继(关键字是“72”)依次顶替空缺】
??图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“52”)需要与父结点内的关键字(关键字是“56”)和右兄弟(关键字是“64、70”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整合并】
??图中步骤③和步骤④,是根据B树删除规则中第①个【先用其直接前驱(关键字“50”(替代是先左后右))替代其位置】,替代后合并关键字“40、46、50、72”即可
??图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“72”)、前驱的前驱(关键字是“70”)依次顶替空缺】
??图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“9”)、前驱的前驱(关键字是“6”)依次顶替空缺】
??图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“5”)需要与父结点内的关键字(关键字是“3”)和左兄弟(关键字是“1、2”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整】
??图中步骤③,是根据B树删除规则中第①个【先用其直接前驱(关键字“23”(替代是先左后右))替代其位置】
??图中步骤④,是根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“40”)顶替空缺】
??图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“50”)、后继的后继(关键字是“52”)依次顶替空缺】
??图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“30”)需要与父结点内的关键字(关键字是“23”)和左兄弟(关键字是“9、12”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整】
??图中步骤③,是根据B树删除规则中第①个【先用其直接前驱(关键字“40”(替代是先左后右))替代其位置】
??图中步骤④,是根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“46”)顶替空缺】
??图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“72”)需要与父结点内的关键字(关键字是“70”)和左兄弟(关键字是“56、64”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整】
??图中步骤③和步骤④,是根据B树删除规则中第①个【先用其直接前驱(关键字“46”(替代是先左后右))替代其位置】,替代后合并关键字“6、40、46、52”即可
??图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“40”)、前驱的前驱(关键字是“30”)依次顶替空缺】
??图中步骤①,根据B树删除规则中第②个【删除后结点关键字的个数未低于下限,直接删除,无需任何处理】
??图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“52”)、后继的后继(关键字是“56”)依次顶替空缺】
??图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“30”)、前驱的前驱(关键字是“23”)依次顶替空缺】
??图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“6”)、前驱的前驱(关键字是“5”)依次顶替空缺】
??图中步骤①,根据B树删除规则中第②个【删除后结点关键字的个数未低于下限,直接删除,无需任何处理】
??图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“44”)需要与父结点内的关键字(关键字是“23”)和左兄弟(关键字是“6、12”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数未低过下限(五阶B树根结点的关键字个数下限是1),无需继续调整】
??图中步骤②,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“6”)顶替空缺】
??图中步骤②,根据B树删除规则中第①个【先用其直接前驱(关键字“52”(替代是先左后右))替代其位置】
??图中步骤③和步骤④,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“46”)、前驱的前驱(关键字是“44”)依次顶替空缺】
??图中步骤②,是根据B树删除规则中第①个【先用其直接前驱(关键字“23”(替代是先左后右))替代其位置】和第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“12”)需要与父结点内的关键字(关键字是“23”)和左兄弟(关键字是“2、3”)进行合并,合并后导致根结点关键字数量-1,数量-1后根结点中关键字个数未低过下限(五阶B树根结点的关键字个数下限是1),无需继续合并】
??关键字序列为(1,2,12,22,23,33,34,132,213,321,342,343,344,676,788,898,2323,5656,5659),其中绿色的图是在线可视化生成B树工具运行结果。这里是为了单独演示删除根结点操作步骤:
??1、B树插入这里不介绍,构建完成后如图4-24所示。
??2、删除关键字“342”,删除后如图4-25所示。
??根据B树删除规则中第①个【先用其直接前驱(关键字“321”(替代是先左后右))替代其位置】和第③个【左兄弟够借,则用当前结点的前驱(关键字是“132”)、前驱的前驱(关键字是“34”)依次顶替空缺】
??3、删除关键字“321”,删除后如图4-26所示。
??根据B树删除规则中第①个【先用其直接前驱(关键字“213”(替代是先左后右))替代其位置】和第③个【左兄弟够借,则用当前结点的前驱(关键字是“34”)、前驱的前驱(关键字是“33”)依次顶替空缺】
??4、删除关键字“213”,删除后如图4-27所示。
??根据B树删除规则中第①个【先用其直接前驱(关键字“132”(替代是先左后右))替代其位置】和第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“34”)需要与父结点内的关键字(关键字是“33”)和左兄弟(关键字是“22、23”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续合并】
??再次根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“12”)需要与父结点内的关键字(关键字是“132”)和右兄弟(关键字是“676、2323”)进行合并,合并后无需继续合并】
??以上就是B树删除的全部过程,涵盖了所有情况。