B树的定义以及插入和删除
一、引入
在二叉查找树中,我们在树中每一个节点内存一个关键字,每次将要查找的数域分为两部分,为了查找更快捷,我们可以依据二叉查找树来建立一个m叉查找树,将树中节点内的关键字增加,将正无穷到负无穷的数域分成更多的部分,增加查找速度
而为了避免树过高或不平衡,影响查找效率,我们在构建m叉查找树时,应满足下面两条要求:
1.在m叉查找树中,规定除了根节点外,任何节点都应至少有m/2个分叉,即至少有([m/2]-1)个关键字
2.对树中任意一个节点,其所有子树的高度都要相同(即叶子节点(失败节点)都在同一层)
二、B树(多路平衡查找树)
B树中所有节点的孩子个数的最大值为B树的阶,通常用m表示。一颗m阶B树要么为空树,要么满足如下的性质:
1.树中的每个节点至多有m颗树,至多有m-1个关键字
2.若树的根节点不是终端节点,那么根节点至少有俩颗子树3.除根节点外,所有非叶子节点至少有[m/2]颗子树,至少有[m/2]-1个关键字
4.所有叶子节点都出现在同一层次上,且不含有信息
5.所有非叶子节点的结构如下
n P0 K1 P1 K2 P1 ......Kn Pn
其中Ki为关键字,K1<K2<......<Kn
Pi为所指向子树根节点的指针,Pi-1所指子树中的所有节点的关键字均小于Ki;Pi所指向子树中所有节点的关键字均大于Ki;n为节点中关键字个数
m阶B树的核心性质:
1.根节点子树数∈[2,m],关键字数∈[1,m-1]
非根节点子树数∈[[m/2],m],关键字数∈[[m/2]-1,m-1]
2.对任意节点,其所有子树高度相同
3.关键字值:子树0<关键字1<子树1......
B树的高度计算
含有n个关键字的m阶B树,它的最小高度和最大高度?
最小高度:让每个节点尽可能满,即有m-1个关键字,m个分叉
那么h层高的B树的关键字最大值=(m-1)×(1+m+m2+......+mh-1)=mh-1≥n
所以,h≥logm(n+1)
最大高度:
方法一:让每个节点的分支尽可能少,即刚刚满足B树对每个节点的基本要求
根节点有2个分支,其他节点有[m/2]个分支,每一层节点至少有:
第一层:1
第二层:2
第三层:2[m/2]
............
第h层:2[m/2]h-2
第h+1层:2[m/2]h-1(叶子节点所在层)
根据B树的一个特性:n个关键字的B树必有n+1个叶子节点
所以:n+1≥2[m/2]h-1,h≤log[m/2]n+1/2+1。
n个关键字将(-∞,+∞)分为n+1个区间,所以会有n+1个失败节点
方法二:令k=[m/2]
| 节点数 | 关键字数 |
|---|---|
| 1 | 1 |
| 2 | 2(k-1) |
| 2k | 2k(k-1) |
| ......... | |
| 2kh-2 | 2kh-2(k-1) |
所以,1+2(k-1)+......+2kh-2(k-1)=1+2(kh-1-1) ≤ n
所以,h≤log[m/2]n+1/2+1
三、B树的插入和删除
B树的插入
在插入关键字key后,若导致原节点的关键字数超过上限,则从中间位置([m/2])将关键字分为两部分,左部分包含的关键字放在原节点中,右部分包含的关键字放入新节点中,中间位置的节点插入原节点的父节点,满足节点内关键字的顺序排列,若此时导致其父节点的关键字个数超过上限,则继续操作,直到传到根节点为止
新元素一定插入的是底层的终端节点,用查找来确定插入的位置
B树的删除
若被删除关键字在非终端节点,用直接前驱或直接后继来代替被删除关键字
若被删除关键字在终端节点:
1.若删除后节点关键字数满足要求(≥[m/2]-1),直接删去
2.若删除后不满足,分为两种情况:
1.兄弟够借:若被删除关键字所在节点的兄弟节点的关键字数还有富裕,则调整该节点,兄弟节点以及父节点:右兄弟富裕,用该节点的后继,后继的后继来补空;左兄弟富裕,用该节点的前驱,前驱的前驱来补空
2.兄弟不够借:若该节点的兄弟节点的关键字个数都等于下限,则将关键字删除后,与它的兄弟节点和父节点进行合并:在合并过程中父节点中的关键字-1,若父节点是根节点且关键字个数减为0,则根节点直接删除,合并后的新节点为根节点;若父节点不是根节点,且关键字个数减少到[m/2]-2,则该父节点要与它的兄弟节点进行调整,直到完全满足B树的性质
链接: 视频