B树

前面讨论2-3树时已经提到过,B树就是一颗平衡M叉树,其插入删除操作都可以与2-3树作类似处理,这里不再赘述。

这里简单讨论下其实际意义:之前的各种二叉树都有一个共同假设,即数据全部存储在内存中,因此讨论时只需关心在找到目标之前需要比较多少次数。但是当数据量大到不适合存放在内存时,就需要借助磁盘来保存了,而磁盘访问相对于内存操作要慢得多得多,因此,这时对于性能的考虑更多的是关心如何减少磁盘访问操作,

思路是将(有序)数据分为 N 批,并用 M 叉平衡树来组织,即访问磁盘时每批返回至多 M-1 项数据,那么在访问某项数据时,至多需要访问磁盘的次数就为 $\log_{M} {N}$

2-3树

前面已经讨论过平衡二叉树Avl,其目的就是通过旋转尽量使树保持平衡,以降低树的高度或查找的时间复杂度。当然,最好的情形是能转化成一颗满二叉树,使树的高度与节点数完全满足 $H = \log_{2} {(n+1)}$,但实际在大部分情形下,无论其如何旋转调整都无法做到,毕竟对于每个节点,其最多只能有一个元素,两个子节点。

既然如此,那就打破规则,允许一个节点最多拥有两个元素,三个子树,这样就不再存在一个节点只有单个子树的情况,取而代之的是节点是二叉还是三叉(如果一个节点只有单个子树,就使其成为三叉节点),这也就是 2-3 树的字面意思:即同时拥有二叉节点和三叉节点的树, 这样在插入删除时就可以自下而上采取分裂合并的方式保证所有叶子节点都在同一层,并使树的节点达到一个绝对平衡的状态。

2-3 树本身并没有什么实际使用场景,但其在思路上打破了二叉树的约束,在树形数据结构中起着一个关键的连接作用,它解决了Avl树无法绝对平衡的问题,并且顺着这个思路可以进一步联想到红黑树以及后面要讲的B树。

红黑树

定义:红黑树是Avl树的一个变种,它也是在二叉树的基础上添加平衡条件,只是它对平衡条件的定义不像AVl树那样直接,而是转化成对节点颜色规则的描述:

  1. 对于任意节点,要么是红色,要么是黑色;
  2. 根节点是黑色的;
  3. 如果一个节点是红色的,那么它的子节点必须是黑色的(即不能有两个连续的红色节点);
  4. 任意节点到其下面各个空结点(后面称为nil节点,并约定其颜色为黑色)的路径上都包含相同数目的黑色节点(称为黑高);

通过对任何一条从根到空节点的路径上各个结点的颜色进行约束,红黑树可以确保没有一条路径会比其他路径长出2倍,因而红黑树是近似平衡的。

AVL树

定义:Avl树在二叉查找树的基础上加了一个平衡条件:对于任意节点,其左右子树的高度差最多为1。

二叉树

前面介绍线性数据结构时提到,如果数据本身有序,那么可以用二分法来降低查找的时间复杂度,但是在线性结构上实现二分法总有一些局限,比如链表不好定位中间元素,而数组又免不了拷贝成本。

因此,有人提出了树这种结构,树本身也是一种链式数据结构,但它巧妙地解决了链式数据只能从头或者从尾开始查找的问题,而是从中间开始向两边查找。不管是下文要介绍的二叉树,还是后面的Avl树、红黑树或者B树,其基本思想都是二分法,区别只在于通过不同的规则来维持树的平衡,以便使查找的复杂度更接近于二分法。

线性结构

从百科中可以找到定义:数据结构即计算机存储、组织数据的方式,它的目标是反映数据元素之间的逻辑关系,其中的逻辑关系是指数据元素之间的前后关系,而与他们在计算机中的存储位置无关。

常见的数据结构可以分为四种:

  1. 集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
  2. 线性结构:数据结构中的元素存在一对一的相互关系;
  3. 树形结构:数据结构中的元素存在一对多的相互关系;
  4. 图形结构:数据结构中的元素存在多对多的相互关系。