How to implement Min Heap using STL?
In C++ STL, there is priority_queue that can directly be used to implement Max Heap. In order to fully understand the code, make sure you are familiar with following concepts in C++
See below example:
C++
// C++ program to show that priority_queue is by // default a Max Heap #include <bits/stdc++.h> using namespace std; // Driver code int main () { // Creates a max heap priority_queue < int > pq; pq.push(5); pq.push(1); pq.push(10); pq.push(30); pq.push(20); // One by one extract items from max heap while (pq.empty() == false ) { cout << pq.top() << " " ; pq.pop(); } return 0; } |
30 20 10 5 1
Since elements are printed in descending order, we have a max heap by default.
How to implement Min Heap?
priority_queue supports a constructor that requires two extra arguments to make it min-heap.
priority_queue <Type, vector<Type>, ComparisonType > min_heap;
`The third parameter, ‘Comparison Type’ can either be a function or functor (aka function object) that must have bool as return-type and must have 2 arguments.
Below is an example for integers.
C++
// C++ program to use priority_queue to implement min heap #include <bits/stdc++.h> using namespace std; // Driver code int main () { // Creates a min heap priority_queue < int , vector< int >, greater< int > > pq; pq.push(5); pq.push(1); pq.push(10); pq.push(30); pq.push(20); // One by one extract items from min heap while (pq.empty() == false ) { cout << pq.top() << " " ; pq.pop(); } return 0; } |
Output:
1 5 10 20 30
Another method for making min-heap using default priority_queue:
This is frequently used in Competitive Programming. We first multiply all elements with (-1). Then we create a max heap (max heap is the default for priority queue). When we access the data and want to print it we simply multiply those elements with (-1) again.
Below is the implementation of the above idea:
C++
// C++ Program to implement min heap // using default priority_queue(max-heap) #include <iostream> #include <queue> using namespace std; int main() { // data int arr[] = { 25, 7, 9, 15, 20, 36, 50 }; // default priority_queue using max-heap priority_queue< int > pq; // size of the array int n = sizeof (arr) / sizeof (arr[0]); // multiply -1 with all elements while // inserting for ( int i = 0; i < n; i++) { pq.push((-1) * arr[i]); } // multiply all elements with -1 while // retrieve the elements while (!pq.empty()) { cout << (pq.top()) * (-1) << " " ; pq.pop(); } return 0; } |
7 9 15 20 25 36 50
How to make a min-heap of user-defined class?
Let us consider below example where we build a min-heap of 2 D points ordered by X-axis.
C++
// C++ program to use priority_queue to implement Min Heap // for user defined class #include <bits/stdc++.h> using namespace std; // User defined class, Point class Point { int x; int y; public : Point( int x, int y) { this ->x = x; this ->y = y; } int getX() const { return x; } int getY() const { return y; } }; // To compare two points class myComparator { public : int operator() ( const Point& p1, const Point& p2) { return p1.getX() > p2.getX(); } }; // Driver code int main () { // Creates a Min heap of points (order by x coordinate) priority_queue <Point, vector<Point>, myComparator > pq; // Insert points into the min heap pq.push(Point(10, 2)); pq.push(Point(2, 1)); pq.push(Point(1, 5)); // One by one extract items from min heap while (pq.empty() == false ) { Point p = pq.top(); cout << "(" << p.getX() << ", " << p.getY() << ")" ; cout << endl; pq.pop(); } return 0; } |
Output:
(1, 5) (2, 1) (10, 2)
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Please Login to comment...