Python 中的二叉堆是什么?17 Mar 2025 | 6 分钟阅读 二叉堆是 Python 中一种重要的非线性数据结构。堆是一个完全二叉树。堆是实现一种称为优先队列的数据结构的高效方法。W. J. Williams 于 1964 年引入了二叉堆,其主要目的是实现堆排序算法。堆不是有序的数据结构。 二叉堆可以分为两种类型
判断二叉树是否为堆
![]() 上述两棵二叉树都是堆。
![]() 在这棵二叉树中,倒数第二层,即第 1 层,只填满了一个节点,但第 1 层到叶节点的节点不是从左到右填满的。因此,它不是堆。 在本教程中,我们将通过示例学习最小堆。 堆数据结构的重要应用
表示二叉堆可以使用数组表示,就像二叉树一样
要将所有其他节点放入数组,可以使用以下两个公式和一个验证公式
验证 父节点索引 = (子节点索引 - 1)/2 这里有一个例子 现在,让我们创建一个数组来表示堆 ![]() 1. 堆有 7 个节点。因此,我们需要创建一个长度为 7 的数组:(0-6) ![]() 2. 堆中的根节点是 1。将 1 放在数组的索引 0 处 ![]() 3. 现在,查看 2 的左子节点 左子节点 = 2*父节点在数组中的索引 + 1 = 2*0 + 1 = 1 ![]() 4. 根节点的右子节点:3 右子节点 = 2*父节点在数组中的索引 + 2 = 2*0 + 2 = 2 ![]() 5. 在下一层:节点(2)的子节点 4: 左子节点 = 2*父节点在数组中的索引 + 1 = 2*索引(2) + 1 = 2*1 + 1 = 3 5: 右子节点 = 2*父节点在数组中的索引 + 2 = 2*索引(2) + 2 = 2*1 + 2 = 4 ![]() 6. 节点(3)的子节点 6: 左子节点 = 2*父节点在数组中的索引 + 1 = 2*索引(3) + 1 = 2*2 + 1 = 5 7: 右子节点 = 2*父节点在数组中的索引 + 2 = 2*索引(3) + 2 = 2*2 + 2 = 6 ![]() 因此,上述堆表示为数组 堆上的操作1. 堆化 给定一个二叉树,将其转换为堆称为“堆化”。我们使用树的数组实现,并将其转换为表示堆的数组 输出 [1, 2, 4, 6, 3, 7, 5] 正如你所观察到的,最小节点 1 被放置在根节点(索引 0)位置,满足了最小堆的属性。 2. 插入节点 给定一个节点,我们需要将其附加到数组末尾,以便从左到右填充最后一个节点,最重要的一步是在插入后对数组进行堆化 输出 [2, 3, 4, 6, 7, 5] [1, 3, 2, 6, 7, 5, 4] 我们将 1 插入堆中。在堆的所有元素中,1 是最小的;根据最小堆的属性,它必须放在根节点(索引 0)处。 3. 从堆中删除元素 如果要删除的节点是叶节点,则可以直接删除。如果它是内部节点,我们需要将该节点与任何叶节点交换,然后删除它。
输出 [2, 3, 4, 6, 7, 5] [1, 3, 2, 6, 7, 5, 4] [2, 3, 4, 6, 7, 5] 4. 获取最小节点/最大节点 在最小堆中,根节点将具有最小值。因此,我们可以编写一个函数来查找最小节点并返回根节点(索引 0)。 同样,在最大堆中,根节点将具有最大值 输出 3 Heapq 模块如前所述,我们可以使用堆来实现优先队列。在 Python 的库中,有一个模块——heapq 模块,用于实现优先队列算法。该模块包含用于不同堆操作的函数,例如 1. heappush(heap, node) 将节点插入堆 2. heappop(heap) 该函数删除并返回堆中的最小元素。 3. heapify(list) 以线性时间将给定列表转换为堆 现在我们将尝试使用 heapq 模块来实现堆操作——插入和删除 输出 Heap: [1, 2, 4, 3, 6, 5] After deleting element at 0th index: [2, 3, 4, 5, 6] Minimum node: 2 堆排序堆排序是可用的排序算法之一。要对元素进行排序,我们将所有给定值推入堆,并且在所有元素插入后,我们将逐个弹出最小的元素 输出 [1, 2, 3] 下一个主题Python 中的命名空间和作用域是什么 |
在本教程中,我们将编写一个 Python 程序,返回数组乘积的符号。这是一个简单的 leetcode 问题,可能会在技术面试中被问到。让我们来理解问题陈述。问题陈述 示例 - 1 输入: nums = [-1,-2,-3,-4, 3, 2, 1] 输出: 1 示例...
阅读 2 分钟
在许多学科中,如图形学、社交网络、交通系统等,图是描述对象之间关系的强大数学结构。在许多应用中,如图分析和计算,这是一项重要的活动,可能具有挑战性,尤其是在处理具有稀疏性的大型网络时...
阅读9分钟
在本教程中,我们将学习如何使用 Python 制作倒计时器。代码将使用用户输入的倒计时持续时间(以秒为单位)。之后,屏幕上将开始显示一个格式为“分钟:秒”的倒计时。时间……
阅读 2 分钟
Python 在软件工程、设计和科学等紧迫领域是一门重要的编程语言。这种灵活、通用的语言在金融行业也带来了许多好处。然而,该语言广泛的应用可能会使其难以找到金融专业学习资源。为了帮助……
阅读 10 分钟
? 在本文中,您将学习如何在 Python 中打印给定矩阵的螺旋矩阵。以下是打印给定矩阵的螺旋矩阵的 Python 实现:def spiral_matrix(matrix): # 定义变量 top, bottom = 0, len(matrix)-1 ...
阅读 6 分钟
scipy.stats.lognorm() 描述了对数正态连续随机变量。它是继承自通用方法的 rv_continuous 类的一个实例。它通过添加特定于此分布的详细信息来完善这些方法。给出对数正态分布的概率密度函数由下式给出:概率密度函数...
阅读 3 分钟
这篇文章将演示如何使用 PyQt5 开发一个火焰计算器。基于两个给定名字的算法,这个火焰计算器评估关系并预测它们可能的结果。最受欢迎和最有效的编程语言是 Python。Python 拥有一个强大的开发者社区...
阅读 10 分钟
在本节中,我们将讨论 Python 编程语言中的赋值运算符。在进入该主题之前,让我们简要介绍一下 Python 中的运算符。运算符是用于在操作数之间执行逻辑和数学运算的特殊符号……
阅读 6 分钟
在本教程中,我们将学习事件驱动编程以及可用于此目的的 Python 模块 (Asyncio)。事件驱动编程最终,程序的流程取决于事件,而专注于事件的编程称为事件驱动编程。我们之前只处理...
阅读 10 分钟
Python 具有特定的内置函数,因此它支持在多个顺序容器中使用多种循环技术。这些循环函数和方法对于竞争性编程非常有用。它可以在用户必须使用一些特定循环技术的不同项目中使用...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India