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

第三层:2m/2

............

第h层:2m/2h-2

第h+1层:2m/2h-1(叶子节点所在层)

根据B树的一个特性:n个关键字的B树必有n+1个叶子节点

所以:n+1≥2m/2h-1,h≤logm/2n+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≤logm/2n+1/2+1

三、B树的插入和删除

B树的插入

在插入关键字key后,若导致原节点的关键字数超过上限,则从中间位置(m/2)将关键字分为两部分,左部分包含的关键字放在原节点中,右部分包含的关键字放入新节点中,中间位置的节点插入原节点的父节点,满足节点内关键字的顺序排列,若此时导致其父节点的关键字个数超过上限,则继续操作,直到传到根节点为止

新元素一定插入的是底层的终端节点,用查找来确定插入的位置

B树的删除

若被删除关键字在非终端节点,用直接前驱或直接后继来代替被删除关键字

若被删除关键字在终端节点:

1.若删除后节点关键字数满足要求(≥m/2-1),直接删去

2.若删除后不满足,分为两种情况:

1.兄弟够借:若被删除关键字所在节点的兄弟节点的关键字数还有富裕,则调整该节点,兄弟节点以及父节点:右兄弟富裕,用该节点的后继,后继的后继来补空;左兄弟富裕,用该节点的前驱,前驱的前驱来补空

2.兄弟不够借:若该节点的兄弟节点的关键字个数都等于下限,则将关键字删除后,与它的兄弟节点和父节点进行合并:在合并过程中父节点中的关键字-1,若父节点是根节点且关键字个数减为0,则根节点直接删除,合并后的新节点为根节点;若父节点不是根节点,且关键字个数减少到m/2-2,则该父节点要与它的兄弟节点进行调整,直到完全满足B树的性质

链接: 视频

相关推荐
初夏睡觉15 小时前
数据结构学习之~二叉堆 (P3378 【模版】堆)
数据结构·c++·学习
云泽80816 小时前
笔试算法 - 链表篇(一):移除、反转、合并、回文判断全解析
数据结构·c++·算法·链表
也曾看到过繁星16 小时前
数据结构-复杂度
数据结构
菜菜的顾清寒16 小时前
HOT力扣100(43)二叉树-翻转二叉树
数据结构·算法·leetcode
Jasmine_llq17 小时前
《B3939 [GESP样题 四级] 绝对素数》
数据结构·算法·素数判断算法·数字拆分与反转算法·区间遍历枚举·双条件判断逻辑
郝学胜-神的一滴17 小时前
干货版《算法导论》07:递归视角下的选择排序与归并排序
java·数据结构·c++·python·程序人生·算法·排序算法
未若君雅裁19 小时前
算法复杂度与数据结构:Java 集合篇的第一块基石
java·数据结构·算法
故事和你9121 小时前
洛谷-【动态规划2】线性状态动态规划4
开发语言·数据结构·c++·算法·动态规划·图论
小欣加油1 天前
leetcode 3300 替换为数位和后的最小元素
数据结构·c++·算法·leetcode
晚风予卿云月1 天前
【枚举】普通枚举
数据结构·c++·算法·竞赛·算法随笔