Как я могу исправить свой метод удаления (Comparable e) в Max Heap? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь удалить (Comparable e) объект, скажем, удалить (2), но когда я пытаюсь удалить его, он удаляет неправильный узел в куче, а не тот, который я хочу удалить.

Вот так выглядит вывод.

Куча перед удалением Redwoods NP:

Bryce Canyon NP Redwoods NP Joshua Tree NP Zion NP Yosemite NP Lassen Volcanic NP 

[
null, 
Bryce Canyon NP, 
Redwoods NP, 
Joshua Tree NP, 
Zion NP, 
Yosemite NP, 
Lassen Volcanic NP
]

После удаления Redwoods NP:

Bryce Canyon NP Redwoods NP Joshua Tree NP Zion NP Redwoods NP 

[
null, 
Bryce Canyon NP, 
Redwoods NP, 
Joshua Tree NP, 
Zion NP, 
Redwoods NP, 
Lassen Volcanic NP
]

BUILD SUCCESSFUL (total time: 1 second)

Ожидаемое

[
Bryce Canyon NP,
Joshua Tree NP, 
Zion NP, 
Yosemite NP, 
Lassen Volcanic NP
] 

Мой код

public void remove(Comparable e) throws NoSuchElementException {

    if (size == 0) {
        throw new NoSuchElementException("Heap is empty! Nothing to be removed");
    }

    Comparable toRemove = e;
    System.out.println(Arrays.toString(heapData));
    Comparable temp = heapData[size-1];
    heapData[size-1] = toRemove;
    toRemove = temp;
    size--;
    maxHeapify(heapData,size);  
}

Метод My Add (Comparable e) кода

public void add(Comparable e) {
        if (size == heapData.length - 1) {
            doubleSize();
        }
        int position = ++size;
        for (; position > 1 && e.compareTo(heapData[position / 2]) < 0; position = position / 2) {
            heapData[position] = heapData[position / 2];
            maxHeapify(heapData, position);
        }

        heapData[position] = e;

    }

1 Ответ

0 голосов
/ 27 марта 2019

здесь:

toRemove = temp;

// эта строка неверна, вы изменяете только объект в куче, а не в массиве. вместо этого сначала напишите метод, который находит позицию e в массиве, и назначьте временный объект этой позиции

добавить метод:

int findRemoveableIndex(Comparable[] input, Comparable e) {
    for(int i = 0; i < input.length; i++) {
        if(input[i].equals(e)) { // or == 
            return i;
        }
    }
    return -1;
}

затем вместо указанного выше назначения сделайте следующее:

heapData[findRemoveableIndex(heapData, e)] = temp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...