Search⌘ K
AI Features

What Is a Max Heap?

Explore the max heap data structure, understanding its properties as a complete binary tree with maximum element at the root. Learn how to implement and manipulate max heaps in Java through essential operations like insert, extract max, peek, isEmpty, isFull, and size, along with their time complexities. This lesson helps you grasp when and why to use max heaps in algorithm design and problem solving.

Max heap

A max heap is a complete binary tree where every parent node is greater than or equal to its children. This means the largest element in the entire heap is always sitting at the root, making it instantly accessible at any time.

Example: Consider a max heap containing the values 14, 10, 8, 5, 2.

Visualization of a max heap
Visualization of a max heap

The root is 14 because it is the largest element. Its children are 10 and 8, both of whom are less than 14. Similarly, 10's children are 5 and 2, both of whom are less than 10. This ordering holds at every level of the tree, which makes it a valid max heap.

In array form, this heap is stored as [14, 10, 8, 5, 2], with the root at index 0.

Key operations on a max heap

Now that we understand what a max heap is, let's explore the fundamental operations that allow us to interact with it. These operations define what makes a max heap useful and how we manipulate the data it holds.

The isEmpty operation

The isEmpty operation returns true if the heap is empty. This is crucial before attempting to remove or view elements, as attempting to extract from an empty heap results in an error.

Example: Consider a max heap that currently holds [14, 10, 8, 5, 2]. The size is 5. Calling isEmpty() on this heap would return false because size is 5, not 0.

If we were to extract the maximum one by one until no elements remain, size would eventually become 0. At that point, calling isEmpty() would return true.

Java implementation

In an array-based max heap, we check if size equals 0. We initialized size to 0 when creating an empty heap, so if it is still 0, no elements have been added.

Java 25
class MaxHeap {
private int capacity;
private int[] data;
private int size;
public MaxHeap(int capacity) {
// Initialize an empty max heap with given capacity
this.capacity = capacity; // Maximum number of elements
this.data = new int[capacity]; // Array to store elements
this.size = 0; // Current number of elements
}
public MaxHeap() {
this(10);
}
public boolean isEmpty() {
// Check if the heap is empty
return size == 0;
}
}
class Main {
public static void main(String[] args) {
MaxHeap heap = new MaxHeap(10);
System.out.println("Is heap empty? " + heap.isEmpty()); // Output: true
}
}

The isFull operation

The isFull operation checks whether the heap has reached its maximum capacity. This is only relevant for array-based heaps with a fixed size. Before inserting a new element, we should check if there is space available.

Example: Consider a max heap with capacity 5 that currently holds [14, 10, 8, 5, 2]. The size is 5 and the capacity is 5. Since size equals capacity, the heap is full. Calling isFull() would return true.

If we extract the maximum element (14), size would become 4. Now size (4) is less than capacity (5), so calling isFull() would return false.

Java implementation

In an array-based max heap, we check if size equals capacity. If size has reached the capacity, then the heap is full, so we return true.

Java 25
class MaxHeap {
int capacity;
int[] data;
int size;
public MaxHeap(int capacity) {
this.capacity = capacity;
this.data = new int[capacity];
this.size = 0;
}
public MaxHeap() {
this(10);
}
public boolean isEmpty() {
return size == 0;
}
public boolean isFull() {
// Check if the heap is full
return size == capacity;
}
}
class Main {
public static void main(String[] args) {
MaxHeap heap = new MaxHeap(5);
// Simulate a full heap with elements: [14, 10, 8, 5, 2]
heap.size = 5;
System.out.println("Is heap full? " + heap.isFull()); // Output: true
System.out.println("Simulating extracting one element from the heap");
heap.size = 4;
System.out.println("Is heap full? " + heap.isFull()); // Output: false
}
}

Note: For linked list-based heaps, isFull() is typically not needed as they can grow dynamically until the system runs out of memory. ...