c - 修复 C 中的堆属性数据结构

标签 c data-structures heap

我正在尝试编写一个恢复堆属性的函数。但我总是得到不好的结果。

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);
    }

}

最佳答案

问题是,如果您选择 leftSon 作为第一个 if block 中的 change,那么您不会将其与rightSon 检查 rightSon > leftSon
因此,在这种情况下,您的示例将失败 -:

  5
 / \
6   7  

事情应该是这样的-:

void fixHeap( int heapSize, struct Edge* edgeArray, int i ) //edgeArray is our heap-array.
{
    int leftSon = leftSonIndex( i );
    int rightSon = rightSonIndex( i );
    int change = i;

    if ( ( leftSon <= heapSize ) && ( edgeArray[change].cost < edgeArray[leftSon].cost ) )
    {
        change = leftSon;
    }
    if ( ( rightSon <= heapSize ) && ( edgeArray[change].cost < edgeArray[rightSon].cost ) )
    {
        change = rightSon;
    }
    if ( change != i )
    {
        swap( edgeArray, i, change );
        fixHeap( heapSize, edgeArray, change );
    }
}

关于c - 修复 C 中的堆属性数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28787620/

相关文章:

c - 在循环中搜索 C 中的字符序列

c - 为什么 select() 在第一次超时后总是返回 0

algorithm - 给定 O(n) 集合,找出其中不同的集合的复杂性是多少?

java - 使用java在特定位置插入节点

time - 建议一种查找时间复杂度最小的好方法

queue - 优先队列和最小/最大堆有什么区别?

c - GCC 不优化未初始化静态常量的结构副本

c - 在 C 中绘制表格——就像 Linux 手册页上的表格

c++ - theSize/2 是什么意思 percolateDown(i) 函数?

algorithm - Leftist Heap 排名的真正目的是什么?