You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二叉最小堆实现优先队列:插入函数异常问题求助

二叉最小堆优先队列插入功能错误的修复方案

你的代码存在三个核心问题,直接导致插入后堆结构不符合最小堆要求:


1. 插入函数父节点索引计算错误

你的堆采用1-based索引(deleteMin从arr[1]取最小值、printQueue从i=1开始遍历),但插入时误用了0-based的父节点计算公式parent=(index-1)/2,这会让新节点错误地和索引0的初始化值比较,而非堆的实际父节点。

正确的1-based父节点计算公式为:parent = index / 2(整数除法),比如索引2、3的父节点都是1,而非0。

2. 下沉调整函数未递归处理

当前percolateDown仅交换一次就终止,没有对交换后的新位置继续做下沉调整,无法完全修正堆结构。需要在交换后递归调用percolateDown处理新的节点位置。

3. 构造函数数组初始化越界

构造函数中循环条件i <= arrSize会访问arr[arrSize],但数组是new int[arrSize],合法索引范围是0到arrSize-1,越界会引发未定义行为。


修正后的完整代码

#include "PriorityQueue.hpp"
#include <iostream>

using namespace std;

PriorityQueue::PriorityQueue():arrSize(100), currentSize(0){
  arr = new int[arrSize];
  // 修正:避免数组越界
  for(int i = 0; i < arrSize; i++){
    arr[i] = 0;
  }
}

bool PriorityQueue::isEmpty(){
  return currentSize == 0;
}

void PriorityQueue::insert(int value){
  currentSize++;
  int index = currentSize;
  arr[index] = value;
  // 修正:1-based父节点计算
  int parent = index / 2;
  // 循环条件改为index>1,根节点无父节点
  while(index > 1 && arr[parent] > arr[index]){
    swap(arr[index], arr[parent]);
    index = parent;
    parent = index / 2;
  }
}

int PriorityQueue::deleteMin(){
  int min = arr[1];
  arr[1] = arr[currentSize];
  currentSize--;
  percolateDown(1);
  return min;
}

void PriorityQueue::printQueue(){
  for (int i = 1; i <= currentSize; i++){
    cout << arr[i] << " ";
  }
  cout << endl;
}

void PriorityQueue::percolateDown(int hole){
  int minIndex = hole;
  int left = 2 * hole;
  int right = 2 * hole + 1;

  if (left <= currentSize && arr[left] < arr[minIndex]){
    minIndex = left;
  }

  if (right <= currentSize && arr[right] < arr[minIndex]){
    minIndex = right;
  }

  if(minIndex != hole){
    swap(arr[hole], arr[minIndex]);
    // 修正:递归处理交换后的新位置
    percolateDown(minIndex);
  }
}

测试验证

插入序列100 70 50 125 45 60 10后,printQueue的输出会变为预期的:

10 45 50 125 100 70 60

内容的提问来源于stack exchange,提问作者hadcol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:53:14