数据结构之树

来源:互联网 发布:网络计算机与淘宝 编辑:程序博客网 时间:2024/05/20 12:23

一、树的基本概念

树(Tree)是元素的集合,树有多个节点可以存储元素

二、二叉树

每个节点最多有两个子节点的树称为二叉树;常用来做二分查找(Binary Search)等

三、B树

即二叉搜索树(Binary Search Tree),是一种特殊形态的二叉树

1、所有节点最多拥有2个子节点

2、所有节点存储一个关键字

3、非叶子节点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树


B树从根节点开始查找,如果查询关键字等于节点则命中。否则,如果查询关键字小于节点关键字则进入左子树查找,如果查询关键字大于节点关键字则进入右子树查找;如果左或右子树指针为空,则表示没有找到匹配的结果。

如果B树的所有非叶子节点左右子树节点数目差不多(平衡),则B树的查找性能逼近二分查找。但它比连续内存空间的二分查找的优点是改变B树结构(插入或删除节点)不需要移动大段内存数据,通常是常熟开销。


但B树在经过多次插入或删除节点后会导致不同的结果,即不再平衡


四、平衡二叉树

平衡二叉树即是在B树的基础上添加了平衡算法,使其保持良好的查询性能

五、其他衍生B树

B-树、B+树、B*树都是多路搜索树,其中B+树是B-树的变体,B*树是B+树的变体

B-树是专门进行查找的多叉树,指针数量为关键字数加1,所有关键字只出现一次,非叶子节点可命中,性能相当于二分查找,避免了失平衡问题,但需要节点分裂和合并

1、B-树

1)所有非叶子节点最多有M个子节点;且M > 2

2)根节点的子节点数目为[2, M],非根非叶子节点的子节点数目为[M/2, M]

3)每个节点存放关键字的数量为M/2 -1(向上取整)到 M-1个(最少2个)

4)非叶子节点关键字个数 = 指向子节点指针个数 - 1

5)非叶子节点的关键字K[1]...K[M-1],且K[i] < K[i + 1]

6)非叶子节点的指针P[1]...P[M],P[1]指向关键字小于K[1]的子节点,P[M]指向关键字大于K[M - 1]的子节点;其他P[i]指向关键字属于(K[i-1],K[i])的子节点

7)所有叶子节点位于同一层

一颗三路B-树


B-树从根节点开始搜索,对节点内关键字(有序)序列进行二分查找,如果命中则结束;否则进入查询关键字所属范围的子节点;重复;直到所对应的子节点指针为空或已经是叶子节点

鉴于以上的定义使得B-树具有以下特性:

1)关键字集合分布在整棵树中

2)任何关键字出现且只出现在一个节点中

3)搜索有可能在非叶子节点结束

4)搜索性能等价于在关键字全集内做一次二分查找

5)自动层次控制

由于除根以外的非叶子节点至少有M/2个子节点,能够确保节点的最低利用率,最差搜索性能为:


说明:M为最大子节点个数,N为关键字总数;可以看出B-树的查询性能与二分查找相同,都为O(log2n),与M值无关,也没有B树的平衡问题;但是由于M/2的限制,在插入或删除节点时需要对节点进行拆分或者合并操作

2、B+树

B+树是B-树的变体,指针数量与关键字数量相等,同一关键字可能出现多次,所有关键字都在叶子节点出现,并通过链表连接,适合文件系统

B+树的定义与B-树基本相同,除了:

1)非叶子节点的子节点个数与关键字个数相等

2)非叶子节点指针P[i]指向关键字属于[K[i], K[i+1]]的子节点(与B-树不同,B-树是开区间)

3)所有关键字都在叶子节点出现,并且所有叶子节点都含有一个链指针

例:最大子节点为3的B+树


B+树搜索与B-树相同,但是只在叶子节点才命中,性能也等价于一次二分查找

B+树的特性:

1)所有关键字都在叶子节点的链表中(稠密索引),而且是关键字有序的

2)不可能在非叶子节点命中

3)非叶子节点相当于叶子节点的索引(稀疏索引),叶子节点相当于存储数据(关键字)的数据层

4)适合文件索引系统

3、B*树

B*树是B+树的变体,在非根和非叶子节点层增加指向兄弟的指针,同时定义非叶子节点关键字个数至少为(2/3)M,即块的最低使用率为2/3(B+树为1/2)


分裂对比:

B+树:分配新节点时,将1/2的数据拷贝至新节点,在父节点中添加新节点的指针

B*树:先确定兄弟节点是否已满 (1) 如不满则先移动一部分数据到兄弟节点,再添加新关键字,最后修改父节点中的兄弟节点关键字;(2)如兄弟节点已满,则分配新的节点,并从自身和兄弟节点各移动1/3的数据到新节点,最后在父节点中添加新节点指针


相对于B+树,B*树通过兄弟节点的指针进一步提高空间利用率,并且降低了分配新节点的概率;但是操作相对复杂一些

简单小结:

B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;性能基本上等于二分查找,有失平衡问题
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;二分查找性能
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;二分查找性能
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;同样是二分查找性能

0 0
原创粉丝点击