我正在爲我的決賽進行學習,並且不確定是否正確插入值6, 7, 57, 54, 96, 3, 9, 4, 2, 8, 32
。我結束了一個樹看起來像:我是否正確插入最大堆?
96
/ \
57 9
/\ /\
6 54 3 7
/\/\
4 2 8 32
誰能告訴我,如果這是正確的,或者如果它沒有指出在那裏我搞砸了?謝謝!
我正在爲我的決賽進行學習,並且不確定是否正確插入值6, 7, 57, 54, 96, 3, 9, 4, 2, 8, 32
。我結束了一個樹看起來像:我是否正確插入最大堆?
96
/ \
57 9
/\ /\
6 54 3 7
/\/\
4 2 8 32
誰能告訴我,如果這是正確的,或者如果它沒有指出在那裏我搞砸了?謝謝!
是你的解決方案是正確的
只要你在代表二進制堆列表的末尾添加新的元素,然後應用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
你總是在堆的末尾添加新的元素,然後調用heapify (或在這裏'maxHeapify()') –