কম্পিউটার

C++ এ দুটি বাইনারি ট্রি মার্জ করুন


ধরুন আমাদের দুটি বাইনারি গাছ আছে এবং বিবেচনা করুন যে যখন আমরা তাদের একটিকে অন্যটিকে আচ্ছাদন করার জন্য রাখি, তখন দুটি গাছের কিছু নোড ওভারল্যাপ হয় যখন অন্যগুলি ওভারল্যাপ হয়। আমাদের তাদের একটি নতুন বাইনারি গাছে একত্রিত করতে হবে। মার্জ নিয়মটি এমন যে যদি দুটি নোড ওভারল্যাপ করা হয়, তাহলে যোগফল নোডের মানগুলি মার্জ করা নোডের নতুন মান হিসাবে বেড়ে যায়। অন্যথায়, অ-খালি নোডটি নতুন গাছের নোড হিসাবে ব্যবহার করা হবে৷

তাই যদি গাছ হয় -

C++ এ দুটি বাইনারি ট্রি মার্জ করুন

তারপর আউটপুট হবে −

C++ এ দুটি বাইনারি ট্রি মার্জ করুন

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • পদ্ধতিটি হল mergeTrees()। এটি দুটি ট্রি নোড n1 এবং n2 নেয়। এটি এরকম

  • যদি n1 খালি হয় এবং n2 খালি না হয়, তাহলে n2 ফেরত দিন, অন্যথায় যখন n2 খালি থাকে এবং n1 খালি না থাকে, তাহলে n1 ফেরত দিন, এবং যখন দুটিই শূন্য থাকে, তখন শূন্য দিন

  • n1 এর মান :=n1 এর মান + n2 এর মান

  • n1 এর বাম :=মার্জট্রিস(n1 এর বাম, n2 এর বাম)

  • n1 এর অধিকার :=মার্জট্রিস(n1 এর ডান, n2 এর ডান)

  • রিটার্ন n1

উদাহরণ (C++)

আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
   public:
      int val;
      TreeNode *left, *right;
      TreeNode(int data){
         val = data;
         left = right = NULL;
      }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         temp->left = new TreeNode(val);
         return;
      }
      else{
         q.push(temp->left);
      }
      if(!temp->right){
         temp->right = new TreeNode(val);
         return;
      }
      else{
         q.push(temp->right);
      }
   }
}
TreeNode *make_tree(vector<int> v){
   TreeNode *root = new TreeNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
void tree_level_trav(TreeNode*root){
   if (root == NULL) return;
   cout << "[";
   queue<TreeNode *> q;
   TreeNode *curr;
   q.push(root);
   q.push(NULL);
   while (q.size() > 1) {
      curr = q.front();
      q.pop();
      if (curr == NULL){
         q.push(NULL);
      }
      else {
         if(curr->left)
            q.push(curr->left);
         if(curr->right)
            q.push(curr->right);
         if(curr->val == 0){
            cout << "null" << ", ";
         }
         else{
            cout << curr->val << ", ";
         }
      }
   }
   cout << "]"<<endl;
}
class Solution {
public:
   TreeNode* mergeTrees(TreeNode* n1, TreeNode* n2) {
      if(!n1 && n2){
         return n2;
      }
      else if(!n2 && n1)return n1;
      else if(!n1 && !n2)return NULL;
      n1->val+=n2->val;
      n1->left = mergeTrees(n1->left,n2->left);
      n1->right = mergeTrees(n1->right,n2->right);
      return n1;
   }
};
main(){
   Solution ob;
   vector<int> v1 = {1,3,2,5};
   vector<int> v2 = {2,1,3,NULL,4,NULL,7};
   TreeNode *root1 = make_tree(v1);
   TreeNode *root2 = make_tree(v2);
   root1 = ob.mergeTrees(root1, root2);
   tree_level_trav(root1);
}

ইনপুট

[1,3,2,5]
[2,1,3,null,4,null,7]

আউটপুট

[3, 4, 5, 5, 4, null, 7, ]

  1. C++ এ সমতুল্য বাইনারি ট্রি ফ্লিপ করুন

  2. C++ এ অনন্য বাইনারি অনুসন্ধান গাছ

  3. C++ এ অনন্য বাইনারি অনুসন্ধান ট্রি II

  4. C++ এ দুটি বাইনারি গাছে প্রথম অ-মেলা পাতা খুঁজুন