如何在Max Heap上修复remove(Comparable e)方法?

时间:2019-03-27 06:27:48

标签: java max-heap

我正在尝试删除(可比较e)对象说remove(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);  
}

我的Add(可比较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 :(得分:0)

此处:

toRemove = temp;

//这行是错误的,您只更改堆中的对象,而不更改数组中的对象。 相反,首先编写一种方法来找到e在数组中的位置,并将temp对象分配给该位置

添加方法:

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;