数据结构之树

221 阅读3分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

不是线性存储结构,其存储的是具有一对多关系的数据元素集合。其包含以下这几个概念:

image.png

结点:使用树结构存储的每一个数据元素都被称为“结点”。例如,上图中,数据元素 A 就是一个结点;

父结点(双亲结点)、子结点和兄弟结点:对图中的结点 A、B、C、D 来说,A 是 B、C、D 结点的父结点(也称为“双亲结点”),而 B、C、D 都是 A 结点的子结点(也称“孩子结点”)。对于 B、C、D 来说,它们都有相同的父结点,所以它们互为兄弟结点。

树根结点(简称“根结点”):每一个非空树都有且只有一个被称为根的结点。

树根的判断依据为:如果一个结点没有父结点,那么这个结点就是整棵树的根结点。

叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。上图中,结点 K、L、F、G、M、I、J 都是这棵树的叶子结点。

子树:在上图中,BEFKL以及CG构成的结点就是子树,单个结点也是一颗树。

:对于一个结点,拥有的子树数(结点有多少分支)称为结点的度

树的高度:树高就是指这个树的层数,有n个结点的树的高大小在log2nlog_2n到n之间

了解了树的一些基本的概念,接下来我们来讲讲B树。

B树

B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树。其类似于红黑树,但是其在降低I/O操作数方面要更好一点。许多数据库系统用B树或者B树的变种进行存储数据。

B树的一个结点可以有很多的孩子。也就是说B树的分支因子很大,其表示高度的对数的底数可以很大。如下是一颗b树:

image.png

要弄清楚为什么说B树是为磁盘或其他直接存储的辅助设备设计的一种树,我们首先得了解一下磁盘的存取机制。磁盘有机械运动的部分,其存取数据的时候磁盘转动耗费的时间相比其他操作要大的多,所以需要尽可能的减少磁盘存取次数,也就是I/O次数。

磁盘一次存取多个数据项,并将其分为一系列相等大小的页面,对于磁盘来说只要定位到了对应的位置,并且盘片已经旋转到所要页面的开头位置,那么其存取数据的速度就很快了。

因为I/O很费时间,而B树的分支因子比较大,使其树高比较小,这样查询的时候B树就避免了频繁的I/O。(查询每个结点都要一次磁盘访问,但是B树通过索引可以快速定位到相应的位置)

B树上的大半部分操作所需的磁盘存取次数都于B树的高度成正比。

B树的每个结点具有如下属性:

  1. x.n,表示当前存储在结点x中的关键字个数。
  2. x.n个关键字本身x.key1,x.key2....x.keyn以非降序存放。
  3. x.left表示是否为叶结点,如果是则该值为TRUE,否则为FALSE

B树树高:如果n>=1,那么对任意一棵包含n个关键字、高度为h、最小度数大于等于2的B树有:h<=logtn+1/2h<=log_tn+1/2