我正在尝试回答以下编程问题:
在 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()
- 我基于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()
有任何想法吗?帮助表示赞赏。