একটি বাইনারি ট্রি দেওয়া আছে। এখন আমাদের কাজ হলো সমান সংখ্যক ১ এবং ০ ধারণকারী সর্বোচ্চ সাবট্রি (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 ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।