B树的定义以及插入和删除

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树的性质

链接: 视频

相关推荐
sin_hielo2 小时前
leetcode 1523
数据结构·算法·leetcode
xu_yule2 小时前
数据结构(7)带头双向循环链表的实现
数据结构·链表
代码游侠2 小时前
复习——线性表
linux·c语言·数据结构·学习·算法
烛衔溟2 小时前
C语言图论:无向图基础
c语言·数据结构·图论·无向图
秋深枫叶红2 小时前
嵌入式第二十九篇——数据结构——树
数据结构·学习·算法·深度优先
小龙报2 小时前
【C语言初阶】动态内存分配实战指南:C 语言 4 大函数使用 + 经典笔试题 + 柔性数组优势与内存区域
android·c语言·开发语言·数据结构·c++·算法·visual studio
小龙报2 小时前
【算法通关指南:算法基础篇(三)】一维差分专题:1.【模板】差分 2.海底高铁
android·c语言·数据结构·c++·算法·leetcode·visual studio
小李小李快乐不已2 小时前
图论理论基础(5)
数据结构·c++·算法·机器学习·动态规划·图论
烛衔溟2 小时前
C语言图论:有向图基础
c语言·数据结构·图论·有向图