次のプログラミングの質問に答えようとしています。
heap.java プログラムでは、このinsert()
メソッドによって新しいノードがヒープに挿入され、ヒープの状態が確実に保持されます。toss()
ヒープ状態を維持しようとせずにヒープ配列に新しいノードを配置するメソッドを作成します。(おそらく、それぞれの新しい項目を単純に配列の末尾に配置できます。)次にrestoreHeap()
、ヒープ全体にわたってヒープ状態を復元するメソッドを記述します。一度に大量のデータを挿入する必要がある場合は、repeatedを使用toss()
してから single を使用する方が、 restoreHeap()
repeatly を使用するよりも効率的です。insert()
手がかりについては、ヒープソートの説明を参照してください。プログラムをテストするには、いくつかのアイテムを挿入し、さらに追加してから、ヒープを復元します。
最後にノードを正常に挿入し、ヒープ条件を変更しない toss 関数のコードを作成しました。ただし、機能に問題がありrestoreHeap
、頭を包むことはできません。以下の2つの機能を含めました。
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()
- これは、trickleUp 関数に基づいており、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()
何か案は?助けていただければ幸いです。