কম্পিউটার

দুটি BST থেকে জোড়া গণনা করুন যার যোগফল C++ এ একটি প্রদত্ত মানের x এর সমান


ইনপুট হিসেবে আমাদের দুটি বাইনারি সার্চ ট্রি এবং একটি ভেরিয়েবল x দেওয়া হয়েছে। লক্ষ্য হল প্রতিটি গাছ থেকে নোডের জোড়া খুঁজে বের করা যাতে নোডের মানের সমষ্টি x এর সমান হয়। BST_1 থেকে নোড 1 এবং BST_2 থেকে নোড 2 নিন এবং উভয়ের ডেটা অংশ যোগ করুন। যোগফল=x হলে। সংখ্যা বৃদ্ধি।

আসুন উদাহরণ দিয়ে বুঝতে পারি।

ইনপুট

দুটি BST থেকে জোড়া গণনা করুন যার যোগফল C++ এ একটি প্রদত্ত মানের x এর সমান

আউটপুট − দুটি BST থেকে জোড়ার সংখ্যা যার যোগফল একটি প্রদত্ত মানের x এর সমান - 1

ব্যাখ্যা − জোড়া হল (8,6)

ইনপুট

দুটি BST থেকে জোড়া গণনা করুন যার যোগফল C++ এ একটি প্রদত্ত মানের x এর সমান

আউটপুট −দুটি BST থেকে জোড়ার সংখ্যা যার যোগফল একটি প্রদত্ত মানের x এর সমান − 2

ব্যাখ্যা − জোড়া হল (5,15) এবং (4,16)

নিচের প্রোগ্রামে ব্যবহৃত পদ্ধতিটি নিম্নরূপ

এই পদ্ধতিতে আমরা একটি পুনরাবৃত্তিমূলক ইনঅর্ডার পদ্ধতি ব্যবহার করে BST-এর পথ অতিক্রম করব। পুনরাবৃত্তিমূলক ইনঅর্ডার পদ্ধতি ব্যবহার করে ক্ষুদ্রতম নোড থেকে সবচেয়ে বড় নোড থেকে বিএসটি 1 অতিক্রম করুন এবং পুনরাবৃত্তিমূলক ইনঅর্ডার পদ্ধতির বিপরীত থেকে বিএসটি 2 অতিক্রম করুন। উভয় BST এর বর্তমান নোডের যোগফল নিন। যোগফল x বৃদ্ধির গণনা হলে। যদি sum>x হয় তাহলে BST 2-এ বর্তমান নোডের পূর্বসূরিতে যান। যদি যোগফল

  • দুটি গাছ নিন BST_1 এবং BST_2 যাতে পূর্ণসংখ্যার ডেটা অংশ থাকে এবং বাম, ডানদিকে চাইল্ড নোডের নির্দেশক থাকে।

  • ফাংশন insert_node(int data) ডাটা সহ ট্রিতে একটি নতুন নোড সন্নিবেশ করায় এবং এতে একটি পয়েন্টার ফেরত দেয়।

  • inser_node() ব্যবহার করে উভয় BST তৈরি করুন এবং BST_sum_x(Tree* BST_1, Tree* BST_2, int x) এ পাস করুন।

  • ফাংশন BST_sum_x(Tree* BST_1, Tree* BST_2, int x) উভয় গাছের রুট নোড নেয় এবং x হিসাবে ডেটা অংশের সমষ্টি সহ নোডের জোড়ার গণনা প্রদান করে।

  • যোগফল x সহ জোড়ার সংখ্যার জন্য 0 হিসাবে প্রাথমিক গণনা নিন।

  • পুনরাবৃত্তিমূলক ইনঅর্ডার ট্রাভার্সালের জন্য দুটি ভেরিয়েবল নিন Tree* stack_top_1, *stack_top_2;

  • দুটি স্ট্যাক তৈরি করুন স্ট্যাক স্ট্যাক_1, স্ট্যাক_2;

  • এখন লুপ থাকার সময় বাইরে শুরু করুন৷

  • যখন লুপ ব্যবহার করে BST_1 এর বামদিকের (সবচেয়ে ছোট) নোডে যান এবং সমস্ত নোডকে স্ট্যাক_1 এ ঠেলে দিন

  • যখন লুপ ব্যবহার করে BST_2 এর ডানদিকের (সর্বশ্রেষ্ঠ) নোডে যান এবং সমস্ত নোডকে স্ট্যাক_2 এ ঠেলে দিন

  • যদি কোন স্ট্যাক খালি থাকে তবে লুপ করার সময় বাইরের অংশটি ভেঙে দিন।

  • উভয় স্ট্যাকের শীর্ষ নোড নিন এবং তাদের ডেটা অংশ যোগ করুন এবং টেম্পে সংরক্ষণ করুন।

  • যদি temp ( যোগফল) ==x হয় তাহলে ইনক্রিমেন্ট গণনা। পপ অপারেশন ব্যবহার করে স্ট্যাক_1 এবং স্ট্যাক_2 উভয় থেকে শীর্ষ উপাদানগুলি সরান৷

  • BST_1=stack_1->ডান এবং BST_2=stack_2->বাম সেট করুন ( BST_1-এ পরবর্তী উত্তরসূরী এবং BST_2-এ পূর্বসূরি)

  • যদি temp

  • IF temp> x তারপর শুধুমাত্র স্ট্যাক_2 থেকে শীর্ষ সরান এবং BST_1-এ পরবর্তী পূর্বসূরিতে যান।

  • বাইরের সময় শেষে, উভয় BST-এর নোডের সমষ্টি x সহ গণনার সংখ্যায় জোড়া রয়েছে।

  • ফলাফল হিসাবে রিটার্ন গণনা।

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
struct Tree{
   int data;
   Tree* left, *right;
};
Tree* insert_node(int data){
   Tree* newNode = (Tree*)malloc(sizeof(Tree));
   newNode->data = data;
   newNode->left = NULL;
   newNode->right = NULL;
}
int BST_sum_x(Tree* BST_1, Tree* BST_2, int x){
   int count = 0;
   Tree* stack_top_1, *stack_top_2;
   stack<Tree*> stack_1, stack_2;
   if (BST_1 == NULL || BST_2 == NULL){
      return 0;
   }
   while (1){
      while (BST_1 != NULL){
         stack_1.push(BST_1);
         BST_1 = BST_1->left;
      }
      while (BST_2 != NULL){
         stack_2.push(BST_2);
         BST_2 = BST_2->right;
      }
      if (stack_1.empty() || stack_2.empty()){
         break;
      }
      stack_top_1 = stack_1.top();
      stack_top_2 = stack_2.top();
      int temp = stack_top_1->data + stack_top_2->data;
      if (temp == x){
         count++;
         stack_1.pop();
         stack_2.pop();
         BST_1 = stack_top_1->right;
         BST_2 = stack_top_2->left;
      }
      else if (temp < x){
         stack_1.pop();
         BST_1 = stack_top_1->right;
      }
      else{
         stack_2.pop();
         BST_2 = stack_top_2->left;
      }
   }
   return count;
}
int main(){
   //BST 1
   Tree* BST_1 = insert_node(15);
   BST_1->left = insert_node(10);
   BST_1->right = insert_node(8);
   BST_1->left->left = insert_node(12);
   BST_1->left->right = insert_node(24);
   BST_1->right->left = insert_node(16);
   //BST 2
   Tree* BST_2 = insert_node(20);
   BST_2->left = insert_node(16);
   BST_2->right = insert_node(4);
   BST_2->left->left = insert_node(18);
   BST_2->left->right = insert_node(28);
   BST_2->right->left = insert_node(22);
   int x = 28;
   cout<<"Count of pairs from two BSTs whose sum is equal to a given value x ar: "<<BST_sum_x(BST_1, BST_2, x);
   return 0;
}

আউটপুট

যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −

উৎপন্ন করবে
Count of pairs from two BSTs whose sum is equal to a given value x ar: 1

  1. একটি বাইনারি গাছে জোড়া গণনা করুন যার যোগফল C++ এ একটি প্রদত্ত মানের x এর সমান

  2. C++ এ একটি প্রদত্ত মান x পর্যন্ত যোগ করা সাবট্রি গণনা করুন

  3. একটি বাছাই করা দ্বিগুণ লিঙ্কযুক্ত তালিকায় ট্রিপলেট গণনা করুন যার যোগফল C++ এ একটি প্রদত্ত মানের x এর সমান।

  4. একটি বাছাই করা দ্বিগুণ লিঙ্কযুক্ত তালিকায় ট্রিপলেট গণনা করুন যার পণ্য C++ এ একটি প্রদত্ত মানের x সমান।