B 树插入

2025年3月17日 | 阅读18分钟

以下教程将讨论如何将一个键插入 B 树。此外,我们将看到在 C、C++、Java 和 Python 等不同编程语言中将键插入 B 树的一些工作示例。

但在我们开始之前,让我们简要回顾一下 B 树数据结构及其属性。

什么是 B 树?

B 树是一种自平衡二叉搜索树数据结构,它以排序形式存储和维护数据,其中根节点的左子节点值小于根节点,右子节点值大于根节点。B 树数据结构允许程序员以高效的方式搜索数据,并以对数时间处理不同的操作。它还允许节点具有两个以上的子节点。B 树的每个节点都存储键值以及指向包含该键的磁盘文件块的数据指针。B 树通常用于实现多级索引。

现在让我们来理解 B 树的一些重要属性。

B 树的属性

以下是 B 树的一些重要属性

  1. 每个节点最多有 m 个子节点,其中 m 是 B 树的阶数。
  2. 具有 K 个子节点的节点包含 K-1 个键。
  3. 除根节点外,每个非叶节点必须至少有 [m/2] 个子节点。
  4. 如果根节点不是叶节点,则至少必须有两个子节点。
  5. 与其它树不同,B 树的高度沿根节点向上增加,插入发生在叶节点。
  6. B 树所有操作的时间复杂度为 O(log?n),其中 'n' 是 B 树中存在的数据元素的数量。

以下是一个 4 阶 B 树的示例

B Tree Insertion

图 1: 4 阶 B 树

现在让我们学习插入在 B 树中是如何工作的。

B 树中的插入操作

在 B 树中插入数据元素包含两个主要事件

  1. 搜索要插入元素的适当节点。
  2. 如果需要,拆分节点。

插入操作始终遵循自底向上(Bottom-Up)的方法。

让我们在下面理解这些事件

步骤 1:如果树为空,则分配一个根节点,然后插入键。

步骤 2:然后更新节点中允许的键数。

步骤 3:然后搜索要插入元素的适当节点。

步骤 4:如果节点已满,我们将按照下面显示的步骤进行。

步骤 4.1:按升序插入数据元素。

步骤 4.2:一旦数据元素超过其限制,我们将以中值拆分节点。

步骤 4.3:然后我们将中值键向上推,使左边的键成为左子节点,右边的键成为右子节点。

步骤 5:如果节点未满,我们将按照下面的步骤进行。

步骤 5.1:我们将按升序插入节点。

让我们通过下面的图示来理解上述步骤。

假设以下是需要插入 B 树的一些数据元素:7、8、9、10、11、16、21 和 18

1. 由于树中节点的最高度为 3;因此,每个节点的最大键数将是 3 - 1 = 2

2. 我们将从将数据元素 7 插入空树开始。

B Tree Insertion

图 2.1:插入 7

3. 我们将把下一个数据元素,即 8,插入到树中。由于 8 大于 7,它将被插入到同一节点中 7 的右侧。

B Tree Insertion

图 2.2:插入 8

4. 类似地,我们将另一个数据元素 9 插入到树中,在 8 的右侧。然而,由于每个节点最多只能有 2 个键,该节点将分裂,将中值键 8 向上推,使 7 成为左子节点的键,9 成为右子节点的键。

B Tree Insertion

图 2.3:插入 9

5. 我们将把下一个数据元素,即 10,插入到树中。由于 10 大于 9,它将被插入到包含 9 作为键的节点右侧。

B Tree Insertion

图 2.4:插入 10

6. 我们现在将另一个数据元素 11 插入到树中。由于 11 大于 10,它应该插入到 10 的右侧。然而,正如我们所知,每个节点最多不能超过 2 个键;因此,10 作为中值,将被推到根节点右侧的 8 旁边,将 911 分裂成两个单独的节点。

B Tree Insertion

图 2.5:插入 11

7. 我们现在将数据元素 16 插入到树中。由于 16 大于 11,它将被插入到包含 11 作为键的节点右侧。

B Tree Insertion

图 2.6:插入 16

8. 我们将插入到树中的下一个数据元素是 21。元素 21 应该插入到 16 的右侧;然而,这将超出每个节点的最大键数限制。因此,将发生分裂,将中值键 16 向上推,并将左侧和右侧的键分裂成单独的节点。但这将再次违反每个节点的最大键数限制;因此,将再次以中值键 10 向上推到根节点,并使 811 成为其子节点。

B Tree Insertion

图 2.7:插入 21

9. 最后,我们将数据元素 18 插入到树中。由于 18 大于 16 但小于 21,它将被插入到包含 21 的节点中的左键。

B Tree Insertion

图 2.8:插入 18

10. 因此,结果的 B 树将如下所示

B Tree Insertion

图 2.9:结果的 B 树

将元素插入 B 树的算法

现在我们将理解我们将用于将数据元素插入 B 树的算法。

伪代码

现在让我们看看上面伪代码在不同编程语言中的实现。

B 树插入操作示例

在下一节中,我们将看到基于上述算法在 C、C++、Java 和 Python 等不同编程语言中实现的 B 树插入操作。

C 语言中插入 B 树元素的程序

现在让我们考虑以下程序代码,说明如何在 C 语言中将数据元素插入 B 树。

程序代码

输出

The B Tree is : 1 2 3 4 6 8 9 10 11 12 13

说明

在上面的代码片段中,我们包含了 stdio.hstdlib.h 头文件,并定义了一些宏,如 MAXMIN。然后我们使用 struct 关键字定义了 B 树节点的结构并创建了节点。然后我们定义了不同的函数来向节点插入值、拆分节点、设置节点的值、在 B 树中插入元素、复制后继节点、执行右移和左移、合并节点、调整节点和遍历树。然后我们定义了 main 函数来执行程序,我们在其中通过调用 insertion_operation() 函数插入了不同的元素。最后,我们调用了 tree_traversal() 函数来打印节点中的元素。

C++ 语言中插入 B 树元素的程序

现在让我们考虑以下程序代码,说明如何在 C++ 语言中将数据元素插入 B 树。

程序代码

输出

The B Tree is : 1 2 3 4 6 8 9 10 11 12 13

说明

在上面的代码片段中,我们包含了 iostream 头文件并使用了标准命名空间。然后我们定义了一个类来创建 B 树节点的结构。然后我们定义了另一个类来创建 B 树。然后我们创建了节点并定义了不同的函数来遍历树、在其上插入键、处理非满条件以及拆分子节点。最后,我们定义了 main 函数并调用 insertValue() 函数插入了不同的键到 B 树,并调用 tree_traversal() 函数打印结果树。

Java 语言中插入 B 树元素的程序

现在让我们考虑以下程序代码,说明如何在 Java 语言中将数据元素插入 B 树。

程序代码

输出

The B Tree is : 1 2 3 4 6 8 9 10 11 12 13

说明

在上面的代码片段中,我们定义了公共类来创建 B 树。在此类中,我们定义了另一个类来创建节点的结构。然后我们创建了 B 树并定义了不同的函数来拆分节点、在节点中插入键以及显示树。我们定义了 main 函数,我们在其中调用了 insertValue() 函数来在节点中插入键。最后,我们还调用了 displayTree() 函数来显示结果的 B 树。

Python 语言中插入 B 树元素的程序

现在让我们考虑以下程序代码,说明如何 在 Python 语言中将数据元素插入 B 树。

程序代码

输出

The B Tree is : 1 2 3 4 6 8 9 10 11 12 13

说明

在上面的代码片段中,我们定义了一个类来创建 B 树节点的结构。在此类中,我们声明了必要的变量并定义了一些函数,例如向以该特定节点为根的子树插入新键的函数、拆分子节点以及遍历树的函数。然后我们定义了另一个类来创建 B 树。在此类中,我们初始化了一些变量并定义了不同的函数,例如遍历树和向节点插入值的函数。最后,我们定义了 main 函数,我们在其中使用 insertValue() 函数将不同的键插入到树中,并通过调用 tree_traversal() 函数打印结果树。

B 树插入操作的时间复杂度取决于节点的数量,因此是 O(log n)

结论

在本教程中,我们学习了 B 树插入操作的基础知识。我们还讨论了在 B 树中执行键插入的算法及其在 C、C++、Java 和 Python 等不同编程语言中的实现。