Я написал следующий код для построения мини-кучи. Это рекурсивный вызов. Я не знаю, где я ошибаюсь, поскольку выход не является минимальным. Если кто-то, пожалуйста, помогите мне в этом:
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
Это явно не min_heap из-за 1952, 1998.
Код выглядит отлично, и то, что вы получаете, представляет собой мини-двоичное представление массива с кучей массива.
Вы можете интерпретировать полученные данные следующим образом:
1935, 1952, 1940, 1998, 1962
root--child1
| |---------- child1
| |------------------child2
|-------child2
и поскольку правила для минимальной кучи:
Дерево - это полное двоичное дерево; то есть все уровни дерева, кроме, возможно, последнего (самого глубокого), полностью заполняются, и, если последний уровень дерева не завершен, узлы этого уровня заполняются слева направо.
Все узлы являются либо [больше или равно], либо [меньше или равно] каждому из своих детей в соответствии с предикатом сравнения, определенным для кучи.
(http://en.wikipedia.org/wiki/Binary_heap)
код правильно вычисляет минимальную кучу. В вашем вопросе мало информации, но для того, что вы только что опубликовали (и из кода), выглядит правильно.