我正在为我的决赛学习,我不确定我是否正确插入了值6, 7, 57, 54, 96, 3, 9, 4, 2, 8, 32
。我最终看到了一棵树:
96
/ \
57 9
/ \ / \
6 54 3 7
/ \ / \
4 2 8 32
任何人都可以告诉我这是否正确,或者是否指出我搞砸了哪里?谢谢!
答案 0 :(得分:2)
这是对的。为什么你认为你搞砸了?
答案 1 :(得分:1)
是的,您的解决方案是正确的
只要在表示二进制堆的列表末尾添加新元素,然后对该元素应用heapify。
Heapify应该将元素与其'进行比较。如果它更大,它应该交换这些元素并继续运行直到你到达根目录。
这里有一些阶段:
6 --> 7 --> 57
/ / \
6 6 7
这是一个java示例:
public class BinaryMinHeap {
public void insert(int value) {
if (heapSize == data.length)
throw new HeapException("Heap's underlying storage is overflow");
else {
heapSize++;
data[heapSize - 1] = value;
heapify(heapSize - 1);
}
}
…
private void heapify(int nodeIndex) {
int parentIndex, tmp;
if (nodeIndex != 0) {
parentIndex = getParentIndex(nodeIndex);
if (data[parentIndex] < data[nodeIndex]) {
tmp = data[parentIndex];
data[parentIndex] = data[nodeIndex];
data[nodeIndex] = tmp;
heapify(parentIndex);
}
}
}
}
代码来源:here