代码是构建最小堆的一部分。看来下面的句子出错了。
if ((child < (int)heap.size() - 1) && (heap[leftchild].cost > heap[leftchild + 1].cost))
但我无法弄清楚如何管理它。有没有人提供一些帮助?非常感谢!!
void heap_adjust_down(vector<rt_node> & rt, vector<h_node> & heap)
{
cout << "the" << heap.size() << "times" << endl;
cout << heap[heap.size()-1].id << endl;
int child;
for (int i = heap.size() / 2; i >= 0; i--)
{
cout << " into build heap, i = " << i << endl;
int leftchild = 2 * i + 1;
h_node temp_h;
for (temp_h = heap[i]; leftchild < (int)heap.size(); i = child)
{
leftchild = 2 * i + 1;
cout << " into percdown" << endl;
child = leftchild;
if ((child < (int)heap.size() - 1) && (heap[leftchild].cost > heap[leftchild + 1].cost))
{
child++;
}
if (heap[child].cost < temp_h.cost )
{
heap[i] = heap[child];
rt[i].h_pos = child;
}
else break;
cout << "i = " << i << endl;
}
heap[i] = temp_h;
rt[i].h_pos = i;
}
}
答案 0 :(得分:0)
问题更可能是这一行:
if (heap[child].cost < temp_h.cost )
此行没有像您在上一个if语句中所做的那样检查child < size
。此外,在内部for循环的第二次迭代中,leftchild
将至少加倍(孩子也是如此)。这似乎不是你的意图。 (leftchild
将加倍,因为您在循环迭代器中设置i = child
。)
内部for循环需要重新考虑。例如,您的测试表达式会测试leftchild < size
,但您会立即根据leftchild
重新计算i
,从而使该测试无效。