В качестве предложения рассмотрите возможность добавления неиспользуемого элемента с индексом 0, чтобы доступ к родителям / дочерним элементам каждого узла был более интуитивным.
Пример
Рассмотрим кучу heap = [-1, 6, 4, 5, 2, 1, 4, 3]
, где корень определен как heap[1]
, а данные для кучи расположены от index = 1
до размера кучи.
Чтобы получить доступ к дочерним узлам на index
, интуитивно понятно, что левый дочерний элемент определен как heap[2 * index]
, а правый дочерний элемент определен как heap[2 * index + 1]
. Точно так же, чтобы получить доступ к родительскому узлу узла в index
, можно использовать усечение int для доступа к родителям:
int parentInd = (int)(index/2);
T parent = heap[parentInd];
Решение
Как указывал raul1ro, вы теряете данные из индекса 0, которые вы не собирались удалять.
В extractMax()
:
T min = queue.get(0);
queue.remove(0);
queue.set(0, queue.get(queue.size() - 1));
должно быть:
T min = queue.get(0); //Get min
T temp = queue.get(queue.size() - 1); //Get the last element in heap as temp
queue.remove(queue.size - 1); //Remove the last element
queue.set(0, temp); //Set the root to the temp value so that you can heapify
Это сделает так, что вы потеряете только 1 элемент, когда вы extractMax()
Надеюсь, это поможет!