对于树,我介绍以下两种,B-树和B+树。
B-树
B-树是一种平衡的多路查找树,它在文件系统中很有用。
B-树的特性
一颗m阶的B-树,或为空树,或为满足下列特性的m叉树;
1)树中每个结点至多有m颗子树;
2)若根结点不是叶子结点,则至少有两颗子树;
3)除根之外的所有非终端结点至少有┌m/2┐棵子树;
4)所有的非终端结点中包含下列信息数据(n,A0,K1,A1,K2,A2,...,Kn,An)
其中:Ki(i=1,...,n)为关键字,且Ki<Ki+1(i=1,...,n-1);Ai(i=0,...,n)为指向子树根结点的指针,且指针Ai-₁所指子树中所有结点的关键字均小于Ki(i=1,...,n),An所指子树中所有结点的关键字均大于Kn,n(┌m/2┐-1<=n<=m-1)为关键字的个数(或n+1为子树个数)。
5)所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
B-树的查找
由B-树的定义可知,在B-树上进行查找的过程和二叉排序树的查找类似。
查找成功的例子
在上图B-树上查找关键字47的过程:首先从根开始,根据根结点指针t找到*a结点,因*a结点中只有一个关键字,且给定值47>关键字35,则若存在必在指针A1所指的子树内,顺指针找到*c结点,该结点有两个关键字(43和78),而43<47<78,则若存在必在指针A1所指的子树中。同样,顺指针找到*g结点,在该结点中顺序查找找到关键字47,由此,查找成功。
查找不成功的例子
在上图B-树上查找关键字23的过程:从根开始,因为23<35,则顺该结点中指针A0找到*b结点,又因为*b结点中只有一个关键字18,且23>18,所以顺结点中第二个指针A1找到*e结点。同理因为23<27,则顺指针往下找,此时因指针所指为叶子结点,说明此棵B-树中不存在关键字23,查找因失败而终结。
B+树
B+树的特性
B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树的差异在于:
1)有n棵子树的结点中含有n个关键字。
2)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3)所有的非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。
B+树的查找
上图为一颗3阶的B+树,通常在B+树,通常在B+树上有两个头指针,一个指向根结点,另一个指向关键字最小的叶子结点。因此,可以对B+树进行两张查找运算:一种是从最小关键字起顺序查找,另一个种是从根结点开始,进行随机查找。
小结
程序=算法+结构。只要将其两者懂了,通了。任何工程都只不过是一些形式上的变化。基础很重要,牢牢地打好地基更重要!