Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구현하는 최소 힙(Min Heap) 프로그램 완벽 가이드

힙(Heap)은 완전 이진 트리(Complete Binary Tree)의 한 형태로, 최소 힙(Min Heap)과 최대 힙(Max Heap) 두 종류가 있습니다.

최대 힙(Max Heap)에서는 루트 노드의 키 값이 힙에 존재하는 모든 키 중에서 가장 커야 하며, 이 성질이 이진 트리의 모든 노드에 대해 재귀적으로 만족되어야 합니다. 반대로 최소 힙(Min Heap)은 루트 노드가 항상 트리 내의 최솟값을 갖는 자료구조입니다.

주요 함수 설명

void BHeap::Insert(int ele): 힙에 새로운 요소를 삽입하는 연산을 수행합니다.

void BHeap::DeleteMin(): 힙에서 최솟값을 삭제하는 연산을 수행합니다.

int BHeap::ExtractMin(): 힙에서 최솟값을 추출하여 반환하는 연산을 수행합니다.

void BHeap::showHeap(): 힙에 저장된 모든 요소를 화면에 출력합니다.

void BHeap::heapifyup(int in): 아래에서 위(bottom-up) 방향으로 힙의 구조를 유지·복원합니다.

void BHeap::heapifydown(int in): 위에서 아래(top-down) 방향으로 힙의 구조를 유지·복원합니다.

C++ 전체 소스 코드

#include <iostream>
#include <cstdlib>
#include <vector>
#include <iterator>
using namespace std;
class BHeap {
    private:
        vector <int> heap;
        int l(int parent);
        int r(int parent);
        int par(int child);
        void heapifyup(int in);
        void heapifydown(int in);
    public:
        BHeap()
        {}
        void Insert(int element);
        void DeleteMin();
        int ExtractMin();
        void showHeap();
        int Size();
};  
int main() {
    BHeap h;
    while (1) {
        cout<<"1.Insert Element"<<endl;
        cout<<"2.Delete Minimum Element"<<endl;
        cout<<"3.Extract Minimum Element"<<endl;
        cout<<"4.Show Heap"<<endl;
        cout<<"5.Exit"<<endl;
        int c, e;
        cout<<"Enter your choice: ";
        cin>>c;
        switch(c) {
            case 1:
                cout<<"Enter the element to be inserted: ";
                cin>>e;
                h.Insert(e);
                break;
            case 2:
                h.DeleteMin();
                break;
            case 3:
                if (h.ExtractMin() == -1) {
                    cout<<"Heap is Empty"<<endl;
                }
                else
                    cout<<"Minimum Element: "<<h.ExtractMin()<<endl;
                break;
            case 4:
                cout<<"Displaying elements of Hwap: ";
                h.showHeap();
                break;
            case 5:
                exit(1);
            default:
                cout<<"Enter Correct Choice"<<endl;
        }  
    }
    return 0;
}
int BHeap::Size() //size of heap {
    return heap.size();
}
void BHeap::Insert(int ele) //insert element in heap {
    heap.push_back(ele);//push element into the heap
    heapifyup(heap.size() -1);//call heapifyup() to maintain heap structure
}
void BHeap::DeleteMin() //delete minimum value from heap {
    if (heap.size() == 0) {
        cout<<"Heap is Empty"<<endl;
        return;
    }
    heap[0] = heap.at(heap.size() - 1);
    heap.pop_back();//pop element
    heapifydown(0);
    cout<<"Element Deleted"<<endl;
}
int BHeap::ExtractMin() //extract minimum value from heap
{
    if (heap.size() == 0) {
        return -1;
    }
    else
        return heap.front();
}
void BHeap::showHeap() //show the elements of heap {
    vector <int>::iterator pos = heap.begin();
    cout<<"Heap --> ";
    while (pos != heap.end()) {
        cout<<*pos<<" ";
        pos++;
    }
    cout<<endl;
}
int BHeap::l(int parent) // return left child of node.
{
    int l = 2 * parent + 1;
    if (l < heap.size())
        return l;
    else
        return -1;
}
int BHeap::r(int parent) // return right child of node.
{
    int r = 2 * parent + 2;
    if (r < heap.size())
        return r;
    else
        return -1;
}
int BHeap::par(int child)// return parent
{
    int p = (child - 1)/2;
    if (child == 0)
        return -1;
    else
        return p;
}
void BHeap::heapifyup(int in)//maintain heap structure in bottom up manner.
{
    if (in >= 0 && par(in) >= 0 && heap[par(in)] > heap[in]) {
        int temp = heap[in];
        heap[in] = heap[par(in)];
        heap[par(in)] = temp;
        heapifyup(par(in));
    }
}
void BHeap::heapifydown(int in)//maintain heap structure in top down manner.
{
    int child = l(in);
    int child1 = r(in);
    if (child >= 0 && child1 >= 0 && heap[child] > heap[child1]) {
        child = child1;
    }
    if (child > 0 && heap[in] > heap[child]) {
        int t = heap[in];
        heap[in] = heap[child];
        heap[child] = t;
        heapifydown(child);
    }
}

실행 결과

1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 1
Enter the element to be inserted: 2
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 1
Enter the element to be inserted: 3
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 1
Enter the element to be inserted: 7
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 1
Enter the element to be inserted: 6
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 4
Displaying elements of Hwap: Heap --> 2 3 7 6
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 3
Minimum Element: 2
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 3
Minimum Element: 2
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 2
Element Deleted
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 4
Displaying elements of Hwap: Heap --> 3 6 7
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Show Heap
5.Exit
Enter your choice: 5