Heaps are a crucial data structure that often comes up in coding interviews. As a software engineer, having a solid grasp of heaps and being able to solve heap-related problems efficiently can make or break your performance in the interview.
In this comprehensive guide, I will walk you through the top 12 heap interview questions that you absolutely need to know before your next big coding interview. From classic questions on implementation and traversal, to more complex problems involving real-world applications, these interview-tested questions will take your heap knowledge to the next level.
A Quick Refresher on Heaps
Before we dive into the questions, let’s do a quick heap refresher.
Heaps are specialized tree data structures that satisfy the “heap property” – the key or value of each node must be greater than (or equal to) the keys of its children in a max heap, and less than (or equal to) in a min heap.
Heaps are commonly implemented using arrays. where
- The root element is stored at array index 0
- The left child of node i is at index 2*i+1
- The right child of node i is at index 2*i+2
- The parent of node i is at index (i-1)/2 (integer division)
This array representation allows for efficient implementation of heap operations like insertion, deletion and peeking/polling in O(log N) time
The two most common types of heaps are:
- Max heap – the largest key is always at the root. Useful for implementing priority queues.
- Min heap – the smallest key is always at the root. Useful for implementing scheduling algorithms.
Now let’s get to those interview questions!
1. Implement a max heap
Difficulty: Medium
One of the most common heap interview questions is to implement a max heap data structure from scratch. Here is some starter code and prompts:
// MaxHeap class public class MaxHeap { // Properties int[] heap; int size; // Constructor public MaxHeap(int capacity) { // Implement this } // Insert key into heap public void insert(int key) { // Implement this } // Remove and return max element public int remove() { // Implement this } // Get max element without removing public int peek() { // Implement this } // Number of elements currently in heap public int getSize() { // Implement this } // Check if heap is empty public boolean isEmpty() { // Implement this }}
When implementing the heap, focus on:
- Maintaining the max heap property after inserts and removes
- Using the array representation to efficiently calculate parent/child indices
- Handling edge cases like empty heap or full capacity
Test your implementation with different inputs and edge cases.
2. Implement a min heap
Difficulty: Medium
This is similar to the previous question, except we have to implement a min heap where the smallest key is always at the root.
// MinHeap classpublic class MinHeap { // Implement min heap here}
The implementation will be nearly identical to max heap, except we will compare keys differently to maintain the min heap ordering.
Make sure to test your min heap thoroughly.
3. Convert a min heap to a max heap
Difficulty: Medium
Given a min heap implementation, how can you efficiently convert it into a max heap?
One approach is to iterate through the entire heap array, removing each element and inserting it into a new max heap. However, this is inefficient as it requires N remove + insert operations.
The optimal approach is to:
- Invert or negate all the keys in the min heap (e.g. key = -key)
- Call heapify on the negated array to restore the max heap ordering
This takes O(N) time since we simply iterate once through the array negating keys, and heapify is O(N).
4. Find the Kth largest element in a heap
Difficulty: Medium
Given a max heap and an integer k, return the kth largest element in the heap.
A brute force approach would be to remove the max element k times. But we can do better than O(klogN)!
Here is a simple O(k + logN) algorithm:
-
Maintain a temporary max heap and initially insert the first k elements from the original heap into it. This takes O(k) time.
-
For each remaining element in the original heap:
-
If the element is larger than the root of the temporary heap, remove the root and insert the larger element. This takes O(logk) time per operation.
-
At the end, the root of the temporary max heap will contain the kth largest element.
-
The overall time complexity is O(k + (N-k)logk) which simplifies to O(k + logN).
5. Merge two heaps
Difficulty: Medium
This question tests your understanding of how to maintain the heap ordering during merge operations.
Given two heaps (max or min), efficiently merge them into a single combined heap containing all elements from both.
One simple O(N) approach is:
-
Create a new empty heap with capacity equal to m + n where m, n are sizes of input heaps
-
Insert all elements from the first heap into the new heap.
-
Insert all elements from the second heap into the new heap.
Since each insert is O(logN) and we insert N elements, overall complexity is O(NlogN).
We can optimize this to O(N) by heapifying the combined array after merging instead of individual logN inserts.
6. Implement a priority queue using a heap
Difficulty: Easy
This is a classic use case for heaps. The interviewer wants to see if you understand the connection between heaps and priority queues.
A simple approach is:
- Use a min heap to implement the priority queue
enqueue()
operation inserts a key into the heapdequeue()
removes and returns the min element from the heap
Additional functionality like peek()
, isEmpty()
, isFull()
can also be implemented on top of the heap.
Explain how using a heap provides O(logN) time operations compared to O(N) for a naive array/list implementation.
7. Convert a BST to a min heap
Difficulty: Hard
Given the root node of a binary search tree (BST), convert it into a min heap data structure.
Here is a high-level algorithm:
-
Perform an in-order traversal of the BST to extract nodes into an array in sorted order. This takes O(N) time.
-
Build a min heap from the array. We can heapify the array in O(N).
The overall time complexity is O(N).
Make sure to explain your approach clearly and analyze the time complexity. This showcases your ability to work with multiple data structures like BSTs and heaps.
8. Find the median element in a max heap
Difficulty: Medium
Given a max heap, efficiently find and return the median element (middle element after sorting). Assume heap size is odd, so there is only 1 median.
A brute force approach would be to fully sort the heap in O(NlogN) time and return the middle element.
Can you solve this in O(N) time?
Hint: Try employing additional storage.
9. Check if a binary tree satisfies the heap property
Difficulty: Medium
Given the root node of a binary tree, check if it satisfies max heap or min heap properties.
Here is some pseudocode:
function isHeap(root): if root is None: return True // Check current node with children if root.left and root.key < root.left.key: return False if root.right and root.key < root.right.key: return False // Recurse return isHeap(root.left) and isHeap(root.right)
We perform a recursive tree traversal validating the heap ordering at each node. The overall time complexity is O(N).
Make sure to clearly explain your recursive approach and time/space complexity.
10. Level order traversal on a heap
Difficulty: Medium
Given a max heap, implement an algorithm to perform level order traversal on the heap.
Level order traversal on a heap is similar to a binary tree except we use the heap array representation.
Here is some starter code:
// heap is the array representationvoid levelOrder(int[] heap) { for (int i = 0; i < heap.length; i++) { // Visit child nodes using index calculation }}
The key steps are:
Heap Frequently Asked Questions (FAQs)
The best choice for a priority queue is a heap because it can retrieve data in constant time and add and remove items in logarithmic time.
What Is a Heap?
A heap is a special kind of tree-based data structure that satisfies the heap property. In a max heap, the value of any node i is greater than or equal to the values of its children. In a min heap, i has a value that is less than or equal to the values of its children.
The shape of heaps is interesting: they are always full or almost full binary trees, where “full” means “not missing any children.” ” This characteristic allows us to represent heaps in a compact manner using arrays.
Top 5 Data Structures they asked me in 127 interviews
FAQ
When to use heap in interview?
Is heap sort important for an interview?
What is the basic concept of heap?
What are the two types of heap data structure?