我一直致力于创建一个字符串堆,并在其上执行各种功能。我现在正在测试我的代码以查看它是否正确插入,而事实并非如此。我正在测试单词Golf, Bravo, Hotel, Alpha, Delta, Echo, Charlie, Foxtrot
,它会按字母顺序插入它们,但是当我打印我的堆时,我最终得到:
Alpha
Bravo Charlie
Foxtrot Delta Hotel Echo
Golf
这是我写的代码:
public boolean insert(String key) {
if(currentSize == maxSize) {
return false;
}
Node newNode = new Node(key);
heapArray[currentSize] = newNode;
trickleUp(currentSize++);
return true;
}
public void trickleUp(int index) {
int parent = (index - 1) / 2;
Node bottom = heapArray[index];
while(index > 0 && heapArray[parent].getKey().compareTo(bottom.getKey()) > 0) {
heapArray[index] = heapArray[parent];
index = parent;
parent = (parent - 1) / 2;
}
heapArray[index] = bottom;
}
编辑:在快速搜索并找到Heap的另一个源代码并对其进行测试后,我获得了相同的输出。有没有理由不按字母顺序添加?
答案 0 :(得分:1)
您在打印输出中显示的行为对于最小堆是正确的,请参阅:
http://en.wikipedia.org/wiki/Heap_(data_structure)
从介绍性段落(重点补充):
父节点的密钥总是大于或等于子节点的密钥,最高密钥在根节点中(这种堆称为最大堆)或父节点的密钥少小于或等于子节点,最低键位于根节点(最小堆)。
从第二段开始(重点补充):
兄弟姐妹或堂兄弟之间没有隐含的排序,并且没有隐含序列用于有序遍历(如在二进制搜索树中那样)。上面提到的堆关系仅适用于节点及其直接父节点之间。
您的堆看起来是正确排序的,因为每个节点只有按字母顺序排列的子节点大于它。