public Object removeMin() throws PriorityQueueEmptyException {
if (isEmpty())
throw new PriorityQueueEmptyException("Empty priority queue!");
Object min = element(T.root());
if (size() == 1)
T.remove();
else {
T.replaceElement(T.root(), T.remove());
Position r = T.root();
while (T.isInternal(T.leftChild(r))) { // down-heap bubbling
Position s;
if (T.isExternal(T.rightChild(r)) ||
comp.isLessThanOrEqualTo(key(T.leftChild(r)), key(T.rightChild(r))))
s = T.leftChild(r);
else
s = T.rightChild(r);
if (comp.isLessThan(key(s), key(r))) {
T.swapElements(r, s);
r = s;
}
else
break;
}
}
return min;
}