কম্পিউটার টিউটোরিয়াল

C++ দিয়ে সমান সংখ্যক ১ ও ০ ধারণকারী সর্বোচ্চ সাবট্রি বের করা

একটি বাইনারি ট্রি দেওয়া আছে। এখন আমাদের কাজ হলো সমান সংখ্যক ১ এবং ০ ধারণকারী সর্বোচ্চ সাবট্রি (largest subtree) বের করা। ট্রিতে শুধু ০ এবং ১ থাকে।

সমাধানের পদ্ধতি

এই পদ্ধতিতে, আমরা ০ মানवाले সব নোডকে -1 দিয়ে রিপ্লেস (replace) করব। এতে প্রোগ্রাম সহজ হয়ে যাবে কারণ এখন আমাদের শুধু সাবট্রির যোগফল (sum) ০ হওয়া খুঁজে বের করতে হবে।

উদাহরণ

উপরোক্ত পদ্ধতির C++ কোড

  #include <iostream> using namespace std; int maxi = -1; struct node { // ট্রি নোড স্ট্রাকচার     int data;     struct node *right, *left; }; struct node* newnode(int key){ // নতুন নোড তৈরি     struct node* temp = new node;     temp->data = key;     temp->right = NULL;     temp->left = NULL;     return temp; } void inorder(struct node* root){ // ট্রাভার্সাল (ব্যবহৃত নয়)     if (root == NULL) return;     inorder(root->left);     cout << root->data << endl;     inorder(root->right); } // সমান ০ ও ১ دار সাবট্রির সর্বোচ্চ সাইজ ফেরানোর ফাংশন int calculatingmax(struct node* root){     int a = 0, b = 0;     if (root == NULL) return 0;     a = calculatingmax(root->right); // ডান সাবট্রি     a = a + 1; // প্যারেন্ট যোগ     b = calculatingmax(root->left); // বাম সাবট্রি     a = b + a; // বর্তমান সাবট্রির নোড সংখ্যা     if (root->data == 0) // পুরো সাবট্রির যোগফল ০ হলে         if (a >= maxi) maxi = a; // সর্বোচ্চ আপডেট     return a; } int calc_sum(struct node* root){ // প্রতিটি নোডের ভ্যালু আপডেট     if (root != NULL){         if (root->data == 0) root->data = -1;     }     int a = 0, b = 0;     if (root->left != NULL) a = calc_sum(root->left);     if (root->right != NULL) b = calc_sum(root->right);     root->data += (a + b);     return root->data; } int main(){     struct node* root = newnode(1);     root->right = newnode(0);     root->right->right = newnode(1);     root->right->right->right = newnode(1);     root->left = newnode(0);     root->left->left = newnode(1);     root->left->left->left = newnode(1);     root->left->right = newnode(0);     root->left->right->left = newnode(1);     root->left->right->left->left = newnode(1);     root->left->right->right = newnode(0);     root->left->right->right->left = newnode(0);     root->left->right->right->left->left = newnode(1);     calc_sum(root);     calculatingmax(root);     cout << maxi;     return 0; }
আউটপুট
6
কোডের ব্যাখ্যা

উপরের পদ্ধতিতে, আমরা ০ ভ্যালুয়ের সব নোডকে -1 দিয়ে আপডেট করি। এতে সমস্যা হয়ে যায় সর্বোচ্চ সাবট্রি খুঁজে বের করা যাতার যোগফল ০। আপডেট করার সময় প্রতিটি নোডকে তার সাবট্রির মোট যোগফল দিয়ে আপডেট করি। তারপর دوم্বর ফাংশনে সব নোড চেক করি যাদের ভ্যালু ০, এবং তাদের সাবট্রির নোড সংখ্যা থেকে সর্বোচ্চটি বের করি।

উপসংহার

এই টিউটোরিয়ালে আমরা সমান সংখ্যক ১ ও ০ ধারণকারী সর্বোচ্চ সাবট্রি বের করার সমস্যা সমাধান করেছি। আমরা এই সমস্যার C++ প্রোগ্রাম ও সম্পূর্ণ পদ্ধতি দেখেছি। একই প্রোগ্রাম C, Java, Python ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।

  1. C++-এ বাইনারি ট্রির সর্ববৃহৎ সাবট্রি সম বের করুন

  2. C++-এ Largest BST Subtree: বাইনারি ট্রিতে সর্বোচ্চ BST সাবট্রি খুঁজে বের করা

  3. C++-এ ইনভার্টেড সাবট্রি (Inverted Subtree) চেক করার প্রোগ্রাম

  4. পাইথনে বাইনারি ট্রিতে একই বাম ও ডান সাবট্রি বিশিষ্ট সর্বোচ্চ সাবট্রি বের করা