২২-৭ঃ Heap এ Deletion ইমপ্লিমেন্টেশন

এইবার আমরা দেখবো কীভাবে একটি Max heap এ একটি ভ্যালু ডিলিট করা হয় তার coding implementation.

Code:

#include <bits/stdc++.h>
using namespace std;


// heap এর ভ্যালু delete করার একটি ফাংশন তৈরি করা হলো 
void delete_heap(vector<int> &v)
{
   // যেহেতু Root এ সবচেয়ে বড় ভ্যালু থাকে এবং তা ডিলিট করতে হবে
    v[0] = v[v.size() - 1]; // তাই ভেক্টরের শেষ index এর ভ্যালুটি root অর্থাৎ 0th index এ রাখা হলো
    v.pop_back(); // যেহেতু শেষ ভ্যালুটি স্টোর করা হয়েছে তাই শেষ index টি ডিলিট করে দেয়া হলো 
    
    // এইবার 0th index এ সবচেয়ে বড় ভ্যালুটি নিয়ে আসার পালা। 
    int cur = 0; // কম্পারিজনের জন্য cur এর ভ্যালু 0 ধরে নিয়ে নিলাম। যা মুলত 0th index বুঝাচ্ছে
    int last_idx = v.size() - 1; // বর্তমানে Node সংখ্যা কত তা বের করে নেয়া হচ্ছে ,  vector এর last index হবে তার চেয়ে এক কম। 
    while (true)
    {
        int left_idx = cur * 2 + 1;  // cur এর left child কোন ইন্ডেক্সে থাকবে তা বের করা হয়েছে
        int right_idx = cur * 2 + 2; // cur এর right child কোন ইন্ডেক্সে থাকবে তা বের করা হয়েছে
        
        if (left_idx <= last_idx && right_idx <= last_idx) // চেক করা হচ্ছে , উক্ত Node এর left এবং right child দুইটাই আছে কিনা
        {
            // যদি দুইটি থাকে 
            if (v[left_idx] >= v[right_idx] && v[left_idx] > v[cur]) // চেক করা হচ্ছে left child এর যে ভ্যালু আছে তা right child থেকে এবং curNode (parent)  থেকে বড় কিনা  
            {
             // যদি left child এর ভ্যালু বড় হয় তবে তা swap করতে হবে 
                swap(v[left_idx], v[cur]); 
                cur = left_idx; // যেহেতু swap করা হয়েছে , তাই এখন cur node চলে গেছে left child এর প্লেসে। তাই cur এ left index এর ভ্যালু রাখা হয়েছে 
            }
            else if (v[right_idx] >= v[left_idx] && v[right_idx] > v[cur]) // চেক করা হচ্ছে right child এর যে ভ্যালু আছে তা left child থেকে এবং curNode (parent)  থেকে বড় কিনা  
            {
                // যদি right child এর ভ্যালু বড় হয় তবে তা swap করতে হবে 
                swap(v[right_idx], v[cur]);
                cur = right_idx;
            }
            else
            { // যদি left child এবং right child কেও curNode থেকে বড় না হয় তবে সেক্ষেত্রে কারো সাথে কম্পেয়ার করতে হবে না। কম্পারিজন এখানে শেষ
                break; 
            }
        }
        // যদি শুধু মাত্র left child থাকে 
        else if (left_idx <= last_idx)
        {
            // left child এর সাথে curNode এর কম্পেয়ার করা হবে
            if (v[left_idx] > v[cur])
            {
                swap(v[left_idx], v[cur]);
                cur = left_idx;
            }
            else // যদি curNode এর ভ্যালু বড় হয় তবে সেক্ষেত্রে আর কম্পারিজন করতে হবে না
            {
                break;
            }
        }
        // যদি শুধু মাত্র right child থাকে 
        else if (right_idx <= last_idx)
        {
            // right child এর সাথে curNode এর কম্পেয়ার করা হবে
            if (v[right_idx] > v[cur])
            {
                swap(v[right_idx], v[cur]);
                cur = right_idx;
            }
            else // // যদি curNode এর ভ্যালু বড় হয় তবে সেক্ষেত্রে আর কম্পারিজন করতে হবে না
            {
                break;
            }
        }
        else // যদি left child বা right child কেও না থাকে তবে সেক্ষেত্রে কোনো comparison না করে ব্রেক করতে হবে
        {
            break;
        }
    }
}

int main()
{
    int n;
    cin >> n;
    vector<int> v;
    for (int i = 0; i < n; i++)
    {
        int x;
        cin >> x;
        insert_heap(v, x);
    }
    delete_heap(v);

    return 0;
}

Last updated