Чтобы добавить примечание к ответу с помощью @ duedl0r, для чего используется сдвиг вверх и вниз, это heapify текущей структуры. Так, например. в случае минимальной кучи, когда вы вставляете элемент, который меньше, чем некоторые узлы в дереве, структура данных теперь не соответствует условию кучи (в случае минимальной кучи значение parent должно быть меньше его дочерних элементов), поэтому Вы должны сдвигаться вверх и вверх.
Итак, с точки зрения кода:
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);
}
}
}
data - это массив для повторения кучи, а heapSize - это текущее место, где будет храниться новый элемент, и он сообщает, что эта куча заполнена.
Аналогично, в случае удаления вы должны использовать shift вниз, чтобы реструктурировать вашу кучу.