我正在学习使用堆,并且作为练习我正在尝试使用我创建的用于对单词进行排序的堆类来编写程序。我已从文件中读取文字并将其成功添加到堆中。我在弄清楚如何打印排序的单词列表时遇到了一些麻烦。根据我对min-heap如何工作的理解,如果我从min / root节点中删除它们将始终按排序顺序删除。到目前为止,我已经尝试过做一个简单的for循环,但是只有一半的堆被删除了。
我的主要尝试
public static void main(String[] args) {
Heap heap = new Heap();
heap = read( heap );
for( int i = 0; i < heap.getSize(); i++){
heap.removeMin();
}
heap.printHeap();
}
这是我的堆类中的删除功能
public Node removeMin(){
Node min = heap.get(0);
int index = heap.size() - 1;
Node last = heap.remove(index);
if( index > 0 ){
heap.set( 0, last );
Node root = heap.get(0);
int end = heap.size() - 1;
index = 0;
boolean done = false;
while(!done){
if(getLCLoc(index) <= end ){
//left exists
Node child = getNodeAt( getLCLoc(index) );
int childLoc = getLCLoc(index);
if( getRCLoc(index) <= end ){
//right exists
if( getNodeAt( getRCLoc(index) ).getData().compareToIgnoreCase( child.getData() ) < 0 ){
child = getNodeAt( getRCLoc(index) );
childLoc = getRCLoc(index);
}
}
if(child.getData().compareToIgnoreCase( root.getData() ) < 0 ){
heap.set( index, child );
index = childLoc;
}else{
done = true;
}
}else{
//no children
done = true;
}
}
heap.set( index, root );
}
return min;
}
答案 0 :(得分:1)
我猜测remove()
会将堆大小减少1.因此,对于循环的每次迭代,您将i
递增1并将堆大小递减1.我会改变一段时间在heapsize&gt; 0时运行的循环。