Description
基本概念
1.树 Tree
树是一种非线性的存储结构,它可以存储一对多的带有结构的数据信息,最简单的树的定义可以理解为一个自顶向下的,由一个根结点(root
)生长出来的,每一个父结点可能有多个分支(或者没有分支)的树。下图就是一个树,顶部的A
是这颗树的根结点,没有子结点的结点称为叶子结点,比如下图中的K
、L
、F
、G
、M
、I
和J
。
上图中的树有四层。
2.二叉树 Binary Tree
二叉树是一种特殊的树,它在树的原始定义的基础上,添加了一个条件,就每一个父节点,最多只能有两个分叉,如下图,是一个二叉树
其中所有的结点,其子结点都不超过两个。
3.二叉查找树(二叉搜索树) Binary Search Tree(BST)
二叉查找树在二叉树的基础之上,又添加了一个条件,即它的结点是有序的,如下图
其中所有的结点,都大于其左子树中的所有结点,且小于其右子树中的所有结点。二叉查找树的这个特点,让在树中查找某一个元素时不需要盲目的遍历整个树,而且可以根据当前结点的大小,来有方向的选择分支。
4.平衡二叉树 Self-Balancing Binary Search Tree
虽然二叉查找树(二叉搜索树)在查找时不需要遍历整个树,但是从上面的图片我们可以看出来当遇到一个特变倾斜的二叉查找树时,这个搜索的效率还是不够高,于是就有了平衡二叉树,其实可以叫做平衡二叉查找树,这个平衡,就体现在它的任意结点的左右子树,其高度差都不超过一,如下图,就是上面的非平衡二叉树经过平衡之后得出的平衡二叉树
5. B树(平衡树) B-Tree
终于到了我们本文的关键概念登场了,经过上面的层层概述之后,B树的定义就简单多了,上面的一系列定义,都是在原有基础上添加某种限制(树--二叉树--二叉查找树--平衡二叉树),就有了新的概念,但是这里要说的B树,是在平衡二叉树的基础之上,放宽了一个条件而来的,即把“每个结点最多只有两个子结点”的条件去掉了,也是B树可以称为“平衡树”。下图就是一个 B树
6.B+树 B+ Tree
B+树是B树的一个扩展,其与B树的不同可以从下面的图片中略知一二
观察上图可以看到其差别主要有
- B+树的叶子结点包含了所有的数据(指向真实数据的指针)
- B+树的叶子结点有一个指向其邻接叶子结点的指针,这样的设计比较有利于在数据库层面进行高效的全表扫描,B树则做不到这一点
- B+树的非叶子结点并不包含指向真实数据的指针,这样的好处是一方面缓存索引时可以节约不少存储空间,另一方面,也可以提高非叶子结点的扇出(fan out),使得非叶子结点可以添加更多的子结点
参考资料
1.https://stackoverflow.com/questions/870218/differences-between-b-trees-and-b-trees