B树和B+_树被广泛应用于关系型存储引擎中。下面结合参考文章,对该内容作简要总结。
1. BST树 & AVL树
1.1 二叉搜索树(BST binary search tree)特性:
1. 所有非叶子结点之多拥有两个儿子(left、right);
2. 所有结点存储一个关键字;
3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树。
BST的搜索结果,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左子树;如果比结点关键字大,就进入右子树;如果左子树或者右子树的指针为空,则报告找不到相应的关键字。
如果BST的所有非叶子结点的左右子树的节点数目保持差不多平衡,那么B树的搜索性能逼近二分查找;但它相比较连续内存空间的二分查找的优点是:改变BST结构(插入与删除节点)不需要移动大段的内存数据,甚至通常是常熟的开销。
但是BST经过多次插入与删除后,有可能导致不同的结构:
右边也是一个BST,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以使用BST还要考虑尽可能让BST保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题。
1.2 平衡二叉树概念:
平衡二叉树(AVL树,发明者为Adel'son-Vel'skii 和 Landis),除了具备二叉查找树的基本特征之外,还具备一个非常重要的特点:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(平衡因子)不超过1。也就是说AVL树每个节点的平衡因子只可能是-1,0,1。
实际使用的BST都是在原BST基础上加上平衡算法,即“平衡二叉树”;如何保持BST节点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在BST中插入和删除结点的策略。
1.3 平衡二叉树的平衡策略:
如何在二叉搜索树中添加数据的同时保持平衡呢?基本思想是:当在二叉排序树中插入一个节点时,首先检查是否因插入而破坏了平衡,若破坏,则找出其中的最小不平衡二叉树,在保持二叉排序树特性的情况下,调整最小不平衡子树中节点之间的关系,以达到新的平衡。所谓最小不平衡子树指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。
2. B树(B-Tree/B-树/B_树/多路搜索树)
2.1 B树的特性:
B树中每一个结点能包含的关键字的数目有一个上界和下界。这个下界可以用一个称作B树的