二叉搜索树实现2025年03月17日 | 阅读 9 分钟 本文介绍了一个使用 C 语言编写的二叉搜索树应用程序的多种操作。二叉搜索树是一种二叉树,其中每个节点的左子树值都小于该节点的值,而该节点的值又小于右子树中的每个值。 在本文中,我们将定义二叉搜索树,并展示如何使用 C 语言来实现各种二叉搜索树操作。 树是一种用于以分层格式表示数据的特定类型的数据结构。它可以被描述为一组节点——事物或实体的集合——它们相互连接以产生层次结构的错觉。树是非线性数据结构,因为它们的数据不是以线性或顺序方式组织的。 二叉搜索树中的项目是根据特定顺序排列的。二叉搜索树要求左节点的值小于父节点,右节点的值大于父节点。根节点的左分支和右分支都遵循此规则,并且是递归的。 建议在继续学习二叉搜索树之前,先快速了解一下树数据结构。 C 语言中的二叉搜索树基础二叉搜索树是一种树状数据结构,它允许用户对信息进行排序和存储。由于每个节点最多只能有两个子节点,因此称为二叉树。它也称为搜索树,因为我们可以在 O(log(n)) 的时间内查找数字。 二叉树的典型特征是
二叉搜索树示例下图显示了两个二叉搜索树,其中一个符合二叉搜索树的所有要求,而另一个则偏离了标准。 ![]() 节点 3 的右子树包含一个小于它的值,因此右边的二叉树不是二叉搜索树。 如何用 C 语言操作二叉搜索树二叉搜索树可以通过三种基本操作来处理: 操作 1:搜索在搜索中,我们需要在数据结构中找到一个特定的项。由于二叉搜索树中的元素是按排序顺序存储的,因此搜索过程变得更加简单。 以下是在二叉树中搜索元素的算法:
借助一个我们试图搜索值为 20 的项的示例,现在让我们探讨一下用 C 语言编写的二叉搜索树中的搜索操作。 步骤 1 ![]() 步骤 2 ![]() 步骤 2 ![]() 操作 2:插入在二叉搜索树中,元素始终插入到叶子节点。如果要插入的元素小于根节点的值或根节点本身,我们从根节点开始搜索操作,并在左子树中寻找一个空位置;否则,我们在右子树中寻找空位置。 以下是将元素添加到二叉树的算法: C 代码 现在我们有一个特定的实例,其中我们试图插入一个值为 65 的项。让我们看看插入在二叉搜索树中是如何工作的。 ![]() ![]() 操作 3:删除在删除操作中,必须从二叉搜索树中删除一个节点,而不能违反其任何属性。删除可能发生在三种情况中的一种: 1. 要删除的第一个节点是叶子节点。 这是从二叉搜索树中删除节点的最简单情况。在这里,我们将叶子节点替换为 NULL 并释放分配的空间。 借助一个显示我们删除值为 90 的节点的示例,我们可以更好地理解二叉搜索树中的删除过程。 ![]() 2. 被删除的节点只有一个子节点。 在这种情况下,目标节点将被其子节点替换,然后子节点将被删除。因此,要删除的值现在将存在于子节点中。因此,为了释放分配的空间,我们将子节点简单地替换为 NULL。 在下面的示例中,必须删除值为 79 的节点。由于此节点只有一个子节点,因此将用 55 替换它。 ![]() 3. 要删除的节点有两个子节点。 与其他两种情况相比,这种情况更复杂。在这里,我们执行以下操作来删除节点:
在下面的示例中,必须删除根节点 45。因此,节点 55 将作为根节点的直接后继节点被添加到其中。节点 45 现在将靠近树的叶子节点,易于删除。 ![]() 用于实现二叉搜索树的 C 程序现在,让我们使用 C 语言来实现二叉树节点的创建和遍历。在这里,我们将重点关注影响二叉搜索树的操作,例如节点的插入、删除和搜索。 ![]() C 语言程序 输出 1 5 7 9 12 15 20 25 30 40 42 45 5 7 12 15 20 25 30 42 C 语言编写的二叉搜索树中的数组表示和遍历我们现在将使用数组来创建一个二叉搜索树程序(C 语言)。将使用数组表示在 C 语言中创建二叉树,然后实现中序、前序和后序遍历。 考虑以下数组并尝试从中创建一棵树 ![]() 在上图中,0 代表 NULL。例如,节点 B 的左右子节点都是 NULL,这表明 B 是一个叶子节点。 C 语言程序 输出 Preorder: D A E G Q B F R V T J L Postorder: G Q E B A V R J L T F D Inorder: G E Q A B D V R F J T L ![]() 具有遍历和链表表示的二叉搜索树的 C 程序我们现在将使用链表在 C 语言中实现二叉树。将使用链表表示在 C 语言中创建二叉树,然后实现中序、前序和后序遍历。 ![]() C 语言程序 输出 Preorder: D A E B F Postorder: E B A F D Inorder: E A B D F C 语言中的二叉搜索树复杂度时间复杂度插入
删除
搜索
空间复杂度
[在这种情况下,树节点的数量是 n。] C 语言中的二叉搜索树应用
结论
文章到此结束。我真诚地希望您觉得这篇文章内容丰富且有益。 下一主题查找替换给定范围内子数组的最大和 |
我们请求您订阅我们的新闻通讯以获取最新更新。