Min Heap in Java (original) (raw)

Last Updated : 11 Jul, 2025

A Min-Heap is a complete binary tree in which the value in each internal node is smaller than or equal to the values in the children of that node. Mapping the elements of a heap into an array is trivial: if a node is stored an index k, then its left child is stored at index 2k + 1 and its right child at index 2k + 2.

Illustration:

        5                      13
     /      \               /       \  
   10        15           16         31 
  /                      /  \        /  \
30                     41    51    100   41

Let us go through the representation of Min heap. So basically Min Heap is a complete binary tree. A Min heap is typically represented as an array. The root element will be at Arr[0]. For any ith node, i.e., Arr[i]

Now let us discuss the operations on Min Heap which is as follows:

Example 1:

Java `

// Java Program to Implement Heaps // by Illustrating Min Heap

// Main class (MinHeap) class GFG {

// Member variables of this class
private int[] Heap;
private int size;
private int maxsize;

// Initializing front as static with unity
private static final int FRONT = 1;

// Constructor of this class
public GFG(int maxsize)
{

    // This keyword refers to current object itself
    this.maxsize = maxsize;
    this.size = 0;

    Heap = new int[this.maxsize + 1];
    Heap[0] = Integer.MIN_VALUE;
}

// Method 1
// Returning the position of
// the parent for the node currently
// at pos
private int parent(int pos) { return pos / 2; }

// Method 2
// Returning the position of the
// left child for the node currently at pos
private int leftChild(int pos) { return (2 * pos); }

// Method 3
// Returning the position of
// the right child for the node currently
// at pos
private int rightChild(int pos)
{
    return (2 * pos) + 1;
}

// Method 4
// Returning true if the passed
// node is a leaf node
private boolean isLeaf(int pos)
{

    if (pos > (size / 2)) {
        return true;
    }

    return false;
}

// Method 5
// To swap two nodes of the heap
private void swap(int fpos, int spos)
{

    int tmp;
    tmp = Heap[fpos];

    Heap[fpos] = Heap[spos];
    Heap[spos] = tmp;
}

// Method 6
// To heapify the node at pos

private void minHeapify(int pos) {
if(!isLeaf(pos)){ int swapPos= pos; // swap with the minimum of the two children // to check if right child exists. Otherwise default value will be '0' // and that will be swapped with parent node. if(rightChild(pos)<=size) swapPos = Heap[leftChild(pos)]<Heap[rightChild(pos)]?leftChild(pos):rightChild(pos); else swapPos= leftChild(pos);

   if(Heap[pos]>Heap[leftChild(pos)] || Heap[pos]> Heap[rightChild(pos)]){
     swap(pos,swapPos);
     minHeapify(swapPos);
   }
   
 }       

}

// Method 7
// To insert a node into the heap
public void insert(int element)
{

    if (size >= maxsize) {
        return;
    }

    Heap[++size] = element;
    int current = size;

    while (Heap[current] < Heap[parent(current)]) {
        swap(current, parent(current));
        current = parent(current);
    }
}

// Method 8
// To print the contents of the heap
public void print()
{
    for (int i = 1; i <= size / 2; i++) {

        // Printing the parent and both childrens
        System.out.print(
            " PARENT : " + Heap[i]
            + " LEFT CHILD : " + Heap[2 * i]
            + " RIGHT CHILD :" + Heap[2 * i + 1]);

        // By here new line is required
        System.out.println();
    }
}

// Method 9
// To remove and return the minimum
// element from the heap
public int remove()
{

    int popped = Heap[FRONT];
    Heap[FRONT] = Heap[size--];
    minHeapify(FRONT);

    return popped;
}

// Method 10
// Main driver method
public static void main(String[] arg)
{

    // Display message
    System.out.println("The Min Heap is ");

    // Creating object of class in main() method
    GFG minHeap = new GFG(15);

    // Inserting element to minHeap
    // using insert() method

    // Custom input entries
    minHeap.insert(5);
    minHeap.insert(3);
    minHeap.insert(17);
    minHeap.insert(10);
    minHeap.insert(84);
    minHeap.insert(19);
    minHeap.insert(6);
    minHeap.insert(22);
    minHeap.insert(9);

    // Print all elements of the heap
    minHeap.print();

    // Removing minimum value from above heap
    // and printing it
    System.out.println("The Min val is "
                       + minHeap.remove());
}

}

`

Output

The Min Heap is PARENT : 3 LEFT CHILD : 5 RIGHT CHILD :6 PARENT : 5 LEFT CHILD : 9 RIGHT CHILD :84 PARENT : 6 LEFT CHILD : 19 RIGHT CHILD :17 PARENT : 9 LEFT CHILD : 22 RIGHT CHILD :10 The Min val is 3

We use PriorityQueue class to implement Heaps in Java. By default Min Heap is implemented by this class which is as shown in below example as follows:

Example 2:

Java `

// Java program to Demonstrate working of PriorityQueue // Using Library Functions

// Importing utility classes import java.util.*;

// Main class class GFG {

// Main driver method
public static void main(String args[])
{

    // Creating empty priority queue
    PriorityQueue<Integer> pQueue
        = new PriorityQueue<Integer>();

    // Adding items to the priority queue
    // using add() method
    pQueue.add(10);
    pQueue.add(30);
    pQueue.add(20);
    pQueue.add(400);

    // Printing the most priority element
    System.out.println("Head value using peek function:"
                       + pQueue.peek());

    // Printing all elements
    System.out.println("The queue elements:");

    // Iterating over objects using Iterator
    // so do creating an Iterator class
    Iterator itr = pQueue.iterator();

    // Iterating toill there is single element left in
    // object using next() method
    while (itr.hasNext())
        System.out.println(itr.next());

    // Removing the top priority element (or head) and
    // printing the modified pQueue using poll()
    pQueue.poll();
    System.out.println("After removing an element "
                       + "with poll function:");

    // Again creating iterator object
    Iterator<Integer> itr2 = pQueue.iterator();

    while (itr2.hasNext())
        System.out.println(itr2.next());

    // Removing 30 using remove()
    pQueue.remove(30);

    System.out.println("after removing 30 with"
                       + " remove function:");

    // Again creating iterator object
    Iterator<Integer> itr3 = pQueue.iterator();
    while (itr3.hasNext())
        System.out.println(itr3.next());

    // Check if an element is present using contains()
    boolean b = pQueue.contains(20);
    System.out.println("Priority queue contains 20 "
                       + "or not?: " + b);

    // Getting objects from the queue using toArray()
    // in an array and print the array
    Object[] arr = pQueue.toArray();
  
    System.out.println("Value in array: ");
  
    for (int i = 0; i < arr.length; i++)
        System.out.println("Value: "
                           + arr[i].toString());
}

}

`

Output:

Head value using peek function:10 The queue elements: 10 30 20 400 After removing an element with poll function: 20 30 400 after removing 30 with remove function: 20 400 Priority queue contains 20 or not?: true Value in array: Value: 20 Value: 400