一、B-树
概念: B-树就是B树,不是B减树,而是B杠树,中文通常称为B树,英语称为B-tree.
二、B树
概念: B树是一种平衡的多路查找树,树中结点最大的孩子数目称为B树对的阶,通常记为m。
- 何为平衡多路查找树:由平衡二叉树演变而来,是为磁盘等外部存储设备设计的一种平衡查找树。
一棵m阶B树或为空树,或为满足如下特性的m叉树:
- 树中每个结点至少有m棵子树。(既至多含有m-1个关键字,两棵子树夹着一个关键字)
- 若根结点不是不是终端结点,则至少有两棵子树。(至少一个关键字)
- 除根结点外的所有非叶结点至少【m/2】棵子树。(既至少含有【m/2】-1个关键字)(向上取整)
- 所有叶子结点出现在同一层次上,不带信息。(叶子结点=终端结点,都是度为0的结点)
- 所有非叶结点的结构如下:
n | P0 | K1 | P1 | K2 | … | Kn | Pn |
---|
- 其中n表示有n个关键字
- 其中Ki(i=1、2…n)为结点的关键字,且满足K1<K2<K3<…<Kn
- 其中Pi(i=1、2…n)为指向子树根结点的指针,且指针P i-1所指的子树的所有结点的关键字都小于K i-1
B树的查找操作
概念: B树是多路查找树,二叉排序树是二路查找,B树是多路查找,所以它是二叉排序树的拓展。因此,B树的查找操作和二叉排序树的查找操作非常类似。
查找过程:
①先让待查找关键字key和结点的中的关键字比较,如果等于某个关键字,则查找成功。
②如果和所有关键字都不想等,则看key处在哪个范围内,然后去对应的指针所指向的子树中查找。
Eg:如果key比第一个关键字K1还小,则去P0指针所指向的子树中查找,如果比最后一个关键字Kn还大,则去Pn指针所指向的子树中查找。
B树的插入操作
实例: 跟据关键字{20、30、50、52、60、69、70},创建一棵3阶B树
由于m=3,所以除了根结点以外,非叶子结点至少有【3/2】-1个关键字,至多有3-1=2个关键字,所以:
B树的删除操作
概念: B树中的删除操作与插入操作类似,但要复杂一些,要使得删除后的结点中关键字个数≥【m/2】-1,因此将涉及结点的“合并”问题。由于删除的关键字位置不同,可以分为关键字在终端结点和不在终端结点两种情况。
①: 如果删除的关键字在终端结点上(最底层的叶子结点):
- 结点内关键字数量大于【m/2】-1,这时删除这个关键字不会破坏B树的定义要求,所以直接删除
- 结点内关键字等于【m/2】-1,并且左右兄弟结点中存在关键字大于【m/2】-1,则去兄弟结点中借关键字
- 结点内关键字等于【m/2】-1,并且左右兄弟结点中存在关键字不大于【m/2】-1,则需要进行结点合并
第1种情况
第2种情况
第3种情况
②: 如果删除的关键字不在终端结点上(最底层的非叶子结点):需要先转换成终端结点上,再按照在终端结点上的情况来分别考虑应对方法。
第一种情况:存在关键字大于【m/2】-1结点的左子树或者右子树,在对应子树上找到该关键字的相邻关键字,然后将相邻关键字替换成待删除的关键字
- 何为相邻关键字:对于不在终端结点上的关键字,它的相邻关键字是其左子树中值最大的关键字或者右子树中值最小的关键字。
- 找出这个待删除关键字的相邻关键字,比如说下图中10的相邻关键字就是9和11,其实就是这个大小序列中该关键字的直接前驱或者直接后驱关键字。
- 将这个待删除关键字和某个相邻关键字互换,然后删除这个关键字
第二种情况:左右子树的关键字数量均等于【m/2】-1,则将这两个左右子树结点合并,然后删除待删除关键字,14
三、B+树
概念:B+树是常用于数据库和操作系统的文件系统中的一种用于查找的数据结构
m阶的B+树与m阶的B树的主要差异在于:
- 在B+树中,具有n个关键字的结点只含有n棵子树,即每个关键字对应一颗子树,在B树中,具有n个关键字的结点含有(n+1)棵子树。
- 在B+树中,每个结点(非根内部结点)关键字个数n的范围是【m/2】≤n≤m(根结点1≤n≤m),在B树中,每个结点(非根内部结点)关键字个数n的范围是【m/2】-1≤n≤m-1(根结点1≤n≤m-1)。
- 在B+树中,叶结点包含信息,所有非叶结点仅起到索引作用,非叶结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含该关键字对应记录的存储地址。
- 在B+树中,叶结点包含了全部关键字,即在非叶结点中出现的关键字也会出现在叶结点中;而在B树中,叶节点包含的关键字和其他结点包含的关键字是不重复的。