前两三周将oracle数据库加上索引以后,查询速度提升不止10倍,深入理解oracle索引以后,其余B树有关,本文再来简单复习一下B树。在写B树之前希望读者可以将AVL树(平衡二叉搜索树),m路搜索树再温故一下,这两种树都是动态搜索树。
- B树的概念(B-树或者B_树,不是“B减树”)
一颗m阶B树是一颗平衡的m路搜索树,他或则是空树,或者满足如下性质:1、根节点至少有两个子女。
2、除根节点以外的所有节点(不包括失败节点)至少有m/2(向上取整)个子女。
3、所有失败节点都位于同一层。
B树的搜索过程是一个在节点内搜索和循某一条路径向下一层搜索交替进行的过程。因此,B树的搜索时间与B树的阶数m和B树的高度h直接有关,必须加以权衡。
- B树的插入
- B树的删除
若该节点不是叶节点,则删除该节点,并用该节点所指子树中关键码最小的节点代替该节点位置,然后删除该子节点。现在问题归于在叶节点中删除关键码了。
叶节点删除有4种情况:
1)、若删除关键码所在叶节点同时又是根节点且删除前该节点中关键码个数n>=2,则直接删去该关键码,删除结束。
2)、若删除关键码所在叶节点不是根节点且删除前该节点中关键码个数n>=m/2(向上取整),则直接删去该关键码,删除结束。
3)、被删关键码所在叶节点 删除前关键码个数n=m/2-1(向上取整),若这时与该节点相邻的右兄弟(若无左兄弟)节点关键码个数n>=m/2(向上取整),则调整该节点达到平衡。
4)、被删关键码所在叶节点删除前关键码个数n=m/2-1(向上取整),若这时与该节点相邻的有兄弟(或左兄弟)关键码个数也为n=m/2-1(向上取整),这必调整节点达到平衡。
图略。