我试图编写一个恢复堆属性的函数。但是我总是得出不好的结果。
void fixHeap(int heapSize, struct Edge* edgeArray, int i){//edgeArray is our heap-array.
int leftSon = leftSonIndex(i);
int rightSon = rightSonIndex(i);
int change;
if((leftSon <= heapSize) && (edgeArray[i].cost < edgeArray[leftSon].cost)){
change = leftSon;
}else{
change = i;
if((rightSon <= heapSize) && (edgeArray[change].cost < edgeArray[rightSon].cost)){
change = rightSon;
}
}
if(change != i){
swap(edgeArray, i, change);
i = change;
fixHeap(heapSize, edgeArray, i);
}
}
答案 0 :(得分:3)
问题是,如果您在第一个leftSon
块中选择change
作为if
,那么您不会将其与rightSon
进行比较,以检查{是否{ {1}}&gt; rightSon
。
因此,在这种情况下你的例子会失败 - :
leftSon
应该如何 - :
5
/ \
6 7