一、 B树
B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用B树和B+树的数据结构,可以说B树的数据结构就是为内外存的数据交互准备的。
规则
查找
在B树上进行查找和二叉树的查找很相似,二叉树是每个节点上有一个关键子和两个分支。B树上每个节点有K个关键字和K+1个分支。二叉树的查找只考虑向左还是向右走,而B树中需要由多个分支决定。
B树的查找分两步,首先查找节点,由于B树通常是在磁盘上存储的所以这步需要进行磁盘IO操作。第二步是查找关键字,当找到某个节点后将该节点读入内存中然后通过顺序或者折半查找来查找关键字。若没有找到关键字,则需要判断大小来找到合适的分支继续查找。
插入操作
对高度为k的m阶B树,新结点一般是插在叶子层。通过检索可以确定关键码应插入的结点位置。然后分两种情况讨论:
- 若该结点中关键码个数小于m-1,则直接插入即可。
-
若该结点中关键码个数等于m-1,则将引起结点的分裂。以中间关键码为界将结点一分为二,产生一个新节点,并把中间关键码插入到父结点(k-1层)中。
-
重复上述工作,最坏情况一直分裂到根节点,建立一个新的根节点,整个B树增加一层。
删除操作
对于终端节点删除有以下几种情况:
- 1.直接删除:若被删除关键字所在节点关键字个数>ceil(m/2)-1,表明删除后仍满足B树定义,直接删除。
- 2.若被删除关键字所在节点关键字总数=ceil(m/2)-1,且与此节点邻近的兄弟节点的关键字个数≥ceil(m/2), 则需要从兄弟节点借一个关键字, 此过程需要调整该节点、双亲节点和兄弟节点的关键字。
在此树中删除24,那么需要从左边借一个节点,使得24位置的值变为23,23位置的值变为21,删除原来21位置的节点
- 3.若被删除关键字所在节点关键字总数=ceil(m/2)-1,且与此节点邻近的兄弟节点的关键字个数=ceil(m/2)-1,则删除关键字,并与一个无法借的兄弟节点和双亲节点中两兄弟子树中间的关键字合并。合并后若双亲节点因减少一个节点导致不符合定义, 则继续执行2、3步骤。
对于非终端节点删除:
- 若小于k的子树中关键字个数>ceil(m/2)-1,则找出k的前驱值k’,并用k’来取代k,再递归地删除k '即可
若大于k的子树中关键字个数>ceil(m/2)-1,则找出k的后继值k’,并用k’来取代k,再递归地删除k '即可
- 若前后两子树关键字个数均为ceil(m/2)-1,则直接两个子结点合并,然后删除k即可。
二、B+树
满足以下特性:
- 每个分支结点最多有m棵子树(子结点)
- 若根结点不是终端结点,则至少有两棵子树
- 除根结点外的所有非叶结点至少有ceil(m/2)棵子树,子树和关键字个数相等
- 所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻结点按大小顺序连接起来
- 所有分支结点(可视为索引的索引)中仅包含他的各个子结点(下一级索引块)中关键字的最大值及指向其子结点的指针