Рекурсивная ошибка минимальной кучи?

0

Я написал следующий код для построения мини-кучи. Это рекурсивный вызов. Я не знаю, где я ошибаюсь, поскольку выход не является минимальным. Если кто-то, пожалуйста, помогите мне в этом:

 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.

  • 0
    1952 меньше, чем 1998, как и следовало ожидать в минимальной куче. Ваш вывод мне кажется хорошим.
  • 0
    1952 и 1940 гг. Превышают 1935 г. 1998 и 1962 гг. Превышают 1952 г. Похоже, все работает отлично.
Показать ещё 1 комментарий
Теги:
data-structures

1 ответ

1
Лучший ответ

Код выглядит отлично, и то, что вы получаете, представляет собой мини-двоичное представление массива с кучей массива.

Вы можете интерпретировать полученные данные следующим образом:

1935, 1952, 1940,    1998,  1962
root--child1
    |    |---------- child1
    |    |------------------child2
    |-------child2

и поскольку правила для минимальной кучи:

  • Дерево - это полное двоичное дерево; то есть все уровни дерева, кроме, возможно, последнего (самого глубокого), полностью заполняются, и, если последний уровень дерева не завершен, узлы этого уровня заполняются слева направо.

  • Все узлы являются либо [больше или равно], либо [меньше или равно] каждому из своих детей в соответствии с предикатом сравнения, определенным для кучи.

(http://en.wikipedia.org/wiki/Binary_heap)

код правильно вычисляет минимальную кучу. В вашем вопросе мало информации, но для того, что вы только что опубликовали (и из кода), выглядит правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню