import [Link].
ArrayList;
import [Link];
public class PowerOfTwoMaxHeap {
private final int branchingFactor;
private List<Integer> heap;
public PowerOfTwoMaxHeap(int branchingFactor) {
if (branchingFactor < 2) {
throw new IllegalArgumentException("Branching factor must
be at least 2");
}
[Link] = branchingFactor;
[Link] = new ArrayList<>();
}
private int parent(int i) {
return (i - 1) / branchingFactor;
}
private int leftChild(int i) {
return i * branchingFactor + 1;
}
private int rightChild(int i) {
return i * branchingFactor + 2;
}
private void swap(int i, int j) {
int temp = [Link](i);
[Link](i, [Link](j));
[Link](j, temp);
}
private void heapifyDown(int i) {
int largest = i;
int left = leftChild(i);
int right = rightChild(i);
if (left < [Link]() && [Link](left) > [Link](largest))
{
largest = left;
}
if (right < [Link]() && [Link](right) >
[Link](largest)) {
largest = right;
}
if (largest != i) {
swap(i, largest);
heapifyDown(largest);
}
}
private void heapifyUp(int i) {
while (i > 0 && [Link](i) > [Link](parent(i))) {
swap(i, parent(i));
i = parent(i);
}
}
public void insert(int value) {
[Link](value);
heapifyUp([Link]() - 1);
}
public int popMax() {
if ([Link]()) {
throw new IllegalStateException("Heap is empty");
}
int max = [Link](0);
swap(0, [Link]() - 1);
[Link]([Link]() - 1);
heapifyDown(0);
return max;
}
}