Я пытаюсь ответить на следующий вопрос программирования:
В программе heap.java метод insert()
вставляет новый узел в кучу и обеспечивает сохранение состояния кучи. Напишите метод toss()
, который помещает новый узел в массив кучи, не пытаясь поддерживать состояние кучи. (Возможно, каждый новый элемент можно просто поместить в конец массива.) Затем напишите метод restoreHeap()
, который восстанавливает состояние кучи по всей куче. Использование toss()
, за которым следует один restoreHeap()
, более эффективно, чем многократное использование insert()
, когда за один раз необходимо вставить большой объем данных. См. описание пирамидальной сортировки для подсказок. Чтобы проверить свою программу, вставьте несколько элементов, добавьте еще несколько, а затем восстановите кучу.
Я написал код для функции toss, которая успешно вставляет узел в конец и не изменяет состояние кучи. У меня проблемы с функцией restoreHeap
, и я не могу понять это. Я включил две функции ниже.
Полный код heap.java находится здесь (включая toss()
и restoreHeap()
)
toss()
— я взял за основу функцию вставки
public boolean toss(int key)
{
if(currentSize==maxSize)
return false;
Node newNode = new Node(key);
heapArray[currentSize] = newNode;
currentSize++;
return true;
} // end toss()
restoreHeap()
— Я основывал это на функцииrickleUp и получаю StackOverflowError.
public void restoreHeap(int index)
{
int parent = (index-1) / 2;
Node bottom = heapArray[index];
while( index > 0 &&
heapArray[parent].getKey() < bottom.getKey() )
{
heapArray[index] = heapArray[parent]; // move it down
index = parent;
parent = (parent-1) / 2;
} // end while
heapArray[index] = bottom;
while(index != 0)
{
restoreHeap(parent++);
}
} // end restoreHeap()
Есть идеи? Помощь приветствуется.