堆数据结构:原理、操作与实现
1. 堆的特性
堆是一种特殊的数据结构,它具有一些有趣的特性。虽然堆有一定的顺序,即子节点的值不能大于其父节点的值(大顶堆),但这种顺序对于在堆中搜索特定值并没有太大帮助。例如,在一个堆中搜索值为 3 的节点,从根节点 100 开始,我们无法确定应该在其左子树还是右子树中搜索。因此,与二叉搜索树相比,堆被认为是弱序的。
堆的另一个重要特性是,根节点总是具有最大的值(大顶堆)或最小的值(小顶堆)。这使得堆成为实现优先队列的理想工具,因为在优先队列中,我们总是希望访问具有最高优先级的值,而这个值可以在堆的根节点中找到。
堆的主要操作有插入和删除。由于在堆中搜索需要检查每个节点,因此搜索通常不是堆的常规操作。此外,堆还可以有一个可选的“读取”操作,即查看根节点的值。
在介绍堆的主要操作之前,我们需要定义一个重要的概念:最后一个节点。堆的最后一个节点是其最底层的最右侧节点。
2. 堆的插入操作
向堆中插入新值的算法步骤如下:
1. 创建一个包含新值的节点,并将其插入到最底层的下一个可用的最右侧位置,使其成为堆的最后一个节点。
2. 将这个新节点与其父节点进行比较。
3. 如果新节点的值大于其父节点的值,则交换这两个节点。
4. 重复步骤 3,直到新节点的父节点的值大于它。
这个将新节点向上移动的过程称为“节点上移”。插入操作的时间复杂度为 O(log N),因为对于具有 N 个节点的二叉树,树大约有 log(N) 层,新值最多需要上移到顶层。
然而,插入算法存在一个小问题:如何找到最后一个节点的位置?由于计算机无法像人类一样直观
超级会员免费看
订阅专栏 解锁全文


被折叠的 条评论
为什么被折叠?



