我编写了以下用于构建最小堆的代码..它是一个递归调用。我不知道我哪里出错了,因为输出不是minheap ..有人可以帮我这个:
void MinHeap(int root, int bottom)
{
int parent;
int temp;
if(bottom > root)
{
parent = (bottom -1) / 2;
if(HeapArray[parent] > HeapArray[bottom])
{
temp = HeapArray[parent];
HeapArray[parent] = HeapArray[bottom];
HeapArray[bottom] = temp;
MinHeap(root, parent);
}else if (HeapArray[parent] > HeapArray[bottom-1])
{
temp = HeapArray[parent];
HeapArray[parent] = HeapArray[bottom-1];
HeapArray[bottom-1] = temp;
MinHeap(root, parent);
}
} }
例如,我得到以下min_heap:
1935年,1952年,1940年,1998年,1962年由于1952年,1998年显然不是一个min_heap。
答案 0 :(得分:1)
代码看起来很好,你得到的是一个最小的二进制堆数组压缩表示。
您可以按如下方式解释您获得的数据:
1935, 1952, 1940, 1998, 1962
root--child1
| |---------- child1
| |------------------child2
|-------child2
并且由于最小堆的规则是:
树是一个完整的二叉树;也就是说,树的所有级别,除了最后一个(最深)之外都是完全填充的,如果是 树的最后一级不完整,该级别的节点是 从左到右填充。
根据比较谓词,所有节点都是[大于或等于]或[小于或等于]其子节点 为堆定义。
(http://en.wikipedia.org/wiki/Binary_heap)
代码正确计算最小堆。您的问题中没有太多信息,但是您刚发布的内容(以及代码中的内容)看起来是正确的。