@ duedl0rで答えるノートを追加するには、現在の構造をheapifyするためにどのシフトアップとシフトダウンが使用されているのですか?だから例えば。最小ヒープの場合、ツリー内のいくつかのノードよりも小さい要素を挿入すると、データ構造はヒープ条件に従わなくなります(最小ヒープの場合、親の値はその子よりも小さくなければなりません)。あなたは上下にシフトする必要があります。コードの点ではそう
:
public void insert(int value) {
if (heapSize == data.length)
throw new HeapException("Heap's underlying storage is overflow");
else {
heapSize++;
data[heapSize - 1] = value;
siftUp(heapSize - 1);
}
}
private void siftUp(int nodeIndex) {
int parentIndex, tmp;
if (nodeIndex != 0) {
parentIndex = getParentIndex(nodeIndex);
/*if parent index data is more than child data, swap*/
if (data[parentIndex] > data[nodeIndex]) {
tmp = data[parentIndex];
data[parentIndex] = data[nodeIndex];
data[nodeIndex] = tmp;
siftUp(parentIndex);
}
}
}
データは、ヒープをresempleする配列で、HEAPSIZEは新しい要素が格納される現在の場所である、そしてそれは、このくらいのヒープがいっぱいであることを伝えます。
同様に、削除する場合は、シフトダウンを使用してヒープを再構成する必要があります。