如何构建最小和最大堆( 三 )

堆进阶:将最大堆转换为最小堆让我们通过实践挑战使我们的学习更进一步 。我们的目标是将最大堆转换为最小堆 。跟随我们的代码解决方案看看它是如何完成的 。
问题描述:实现一个函数convertMax(maxHeap),将二进制最大堆转换为二进制最小堆,其中maxHeap是 格式的数组maxHeap(即父级大于子级) 。您的输出应该是转换后的数组 。
输入示例:
maxHeap = [9,4,7,1,-2,6,5]示例输出:
result = [-2,1,5,9,4,6,7]

如何构建最小和最大堆

文章插图
function convertMax(maxHeap) {return maxHeap}上面的代码解决方案可以运行 。我们可以将给定视为maxHeap一个规则的元素数组,并将其重新排序,以便它准确地表示最小堆 。该函数通过在每个节点上convertMax()调用该函数 , 从最低父节点开始恢复所有节点上的堆属性 。minHeapify()
构建堆的时间复杂度为O ( n ) 。对于这个问题也是如此 。
function minHeapify(heap, index) {var left = index * 2;var right = (index * 2) + 1;var smallest = index;if ((heap.length > left) && (heap[smallest] > heap[left])) {smallest = left}if ((heap.length > right) && (heap[smallest] > heap[right]))smallest = rightif (smallest != index) {var tmp = heap[smallest]heap[smallest] = heap[index]heap[index] = tmpminHeapify(heap, smallest)}return heap;}function convertMax(maxHeap) {for (var i = Math.floor((maxHeap.length) / 2); i > -1; i--)maxHeap = minHeapify(maxHeap, i)return maxHeap}var maxHeap = [9,4,7,1,-2,6,5]console.log(convertMax(maxHeap))常见的问题以下是一些常见的挑战,有助于测试您对堆数据结构的了解 。可能会在编码面试中看到以下问题:
  • 将最大堆转换为最小堆
  • 查找数组中 k 个最小元素
  • 查找数组中第 k 个最大元素
  • 检查给定数组是否代表最小堆
  • 合并M个可变长度的排序列表
  • 从每个给定列表中查找至少包含一个元素的最小范围
尝试解决这些问题,对堆数据结构会有更深入的了解!
总结总结来说,构建最小堆和最大堆的步骤都是逐个插入元素 , 并通过与父节点的比较来调整元素的位置,以满足堆的性质 。这样可以构建一个高效的数据结构,用于高效地插入、删除和访问优先级顺序的元素 。




推荐阅读