AVL树 vs B树 vs B+树

三种树结构在工业中使用范围很广,例如MySQL的索引实现即是基于B+树
这篇文章中主要对AVL树的基础特点进行说明,没有完成代码层面的深层探究。

I、AVL树

平衡二叉树(AVL树):是一种二叉排序树(BST),其中每个节点的左子树和右子树的高度差至多等于1.也就是说AVL树的平衡因子只可能是1,0,-1。
对于如何判断一棵二叉树是否是AVL树可以参见《剑指offer》树 专题中的39_2题。

II、B树

多路查找树(B树):是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。节点最大的孩子称为B树的阶(order),因此,2-3树是3阶B树,2-3-4树是4阶B树。
B树的所有分支节点包含下列信息数据(其中,n表示节点中关键字的个数,Ki为关键字,Ai为指向子树的指针):

《AVL树 vs B树 vs B+树》

下图为一棵B树的示意图:

《AVL树 vs B树 vs B+树》 B树示意图

观察B树,总结其查找过程就是一个顺指针查找节点和节点中查找关键字的交叉过程(很类似于MySQL先查找索引的过程),这也正是多路查找树名字的由来。
比如说,我们要查找的数字是7,则首先从外存(比如说硬盘)中读取节点3,5,8到内存中,确定7位于5和8之间,所以沿着指针A2将6,7节点读入内存,即可查找到数字7。

由上面的例子可以得出:B树的数据结构对内外存的数据交互产生了很好的作用。

III、B+树

B树查找虽然很方便,但是存在一个缺陷,如果我们要完成对数据的遍历(或者是局部遍历),以B树的形式就会造成不断的在内外存做数据交互,这显然是影响性能的。为了解决这个问题,我们有了B+树。

B+树是应文件系统所需而出现的B树的变形树,从严格意义上来说,他已经不是树结构了。在B树中,每个元素在该树中只能出现一次;而对于B+树来说,出现在分支节点中的元素当做它们在该分支节点位置的中序后继者被再次列出。另外,每一个叶子节点都会保存一个指向下一个叶子节点的指针。

B+树的结构如下图:

《AVL树 vs B树 vs B+树》 B+树结构示意图

由上图可以观察得到,B+树可以通过与B树相同的方式完成随机查找,其优势特点在于:
1、如果从最小关键字进行从小到大的顺序查找,就可以直接从最左侧的叶子节点出发,不需要经过分支结点,而是沿着指向下一个叶子的指针就可以遍历得到所有的关键字。
2、B+树还适合范围查找,加入我们想要得到3到8之间的所有元素,就可以通过从根结点出发沿着指针找到3,再顺序查找到8以前的元素。

【参考】
[1] 《大话数据结构》

欢迎转载,转载请注明出处wenmingxing AVL树 vs B树 vs B+树

    原文作者:wenmingxing
    原文地址: https://www.jianshu.com/p/272f426a4231
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞