কম্পিউটার

C++ এ সম্পূর্ণ বাইনারি ট্রি ইনসার্টার


যেমন আমরা জানি একটি সম্পূর্ণ বাইনারি ট্রি হল একটি বাইনারি ট্রি যেখানে প্রতিটি স্তর, সম্ভবত শেষটি ব্যতীত, সম্পূর্ণরূপে পূর্ণ হয় এবং সমস্ত নোড যতটা সম্ভব বাকি থাকে৷ আমাদের একটি ডেটা স্ট্রাকচার সিবিটিআই ইনসার্টার লিখতে হবে যা একটি সম্পূর্ণ বাইনারি ট্রি দিয়ে শুরু করা হয় এবং এটি নিম্নলিখিত ক্রিয়াকলাপগুলিকে সমর্থন করে—

  • CBTIinserter(TreeNode root) এটি হেড নোড রুট সহ একটি প্রদত্ত ট্রিতে ডেটা স্ট্রাকচার শুরু করে;

  • CBTInserter.insert(int v) একটি TreeNode ট্রিতে একটি মান node.val =v সহ ঢোকানোর জন্য ব্যবহার করা হবে যাতে গাছটি সম্পূর্ণ থাকে, এবং সন্নিবেশিত TreeNode-এর প্যারেন্টের মান ফেরত দেয়;

  • CBTInserter.get_root() এটি গাছের প্রধান নোড ফিরিয়ে দেবে।

সুতরাং উদাহরণস্বরূপ, যদি আমরা গাছটি [1,2,3,4,5,6] হিসাবে শুরু করি, তারপর 7 এবং 8 সন্নিবেশ করি, তারপর ট্রি পেতে চেষ্টা করি, আউটপুট হবে:3, 4, [1,2] ,3,4,5,6,7,8], 3 হল কারণ 3 এর অধীনে 7 ঢোকানো হবে, এবং 4 হল কারণ 4 এর অধীনে 8 ঢোকানো হবে৷

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

  • একটি সারি q, এবং একটি মূল

    সংজ্ঞায়িত করুন
  • ইনিশিয়ালাইজার সম্পূর্ণ বাইনারি ট্রি নেবে, তারপর নিচের মত কাজ করবে

  • প্রদত্ত রুট হিসাবে রুট সেট করুন, q

    -এ রুট সন্নিবেশ করুন
  • যদিও সত্য -

    • যদি রুটের বাম উপস্থিত থাকে, তাহলে q-তে রুটের বাম ঢোকান, অন্যথায় লুপ ভাঙুন

    • যদি রুটের ডান উপস্থিত থাকে, তাহলে রুটের ডানদিকে q ঢোকান এবং q থেকে সামনের নোড মুছে দিন, অন্যথায় লুপ ভেঙে দিন

  • সন্নিবেশ পদ্ধতি থেকে, এটি মান v

    নেবে
  • প্যারেন্ট সেট করুন :=q এর সামনের উপাদান, temp :=v মান সহ নতুন নোড, এবং এটি q-এ প্রবেশ করান

  • যদি পিতা-মাতার বাম অংশ উপস্থিত না থাকে, তাহলে পিতা-মাতার বাঁদিকে সেট করুন :=temp অন্যথায় q থেকে সামনের উপাদান মুছে দিন এবং পিতা-মাতার ডান সন্তান হিসাবে টেম্প সন্নিবেশ করুন

  • অভিভাবকের মান ফেরত দিন

  • getRoot() পদ্ধতি থেকে, রুট ফেরত দিন

উদাহরণ(C++)

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

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
   public:
      int val;
      TreeNode *left, *right;
      TreeNode(int data){
         val = data;
         left = NULL;
         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){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
      } else {
         q.push(temp->left);
      }
      if(!temp->right){
         if(val != NULL)
            temp->right = new TreeNode(val);
         else
            temp->right = new TreeNode(0);
         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 == NULL || curr->val == 0){
            cout << "null" << ", ";
         } else{
            cout << curr->val << ", ";
         }
      }
   }
   cout << "]"<<endl;
}
class CBTInserter {
public:
   queue <TreeNode*> q;
   TreeNode* root;
   CBTInserter(TreeNode* root) {
      this->root = root;
      q.push(root);
      while(1){
         if(root->left){
            q.push(root->left);
         }
         else break;
         if(root->right){
            q.push(root->right);
            q.pop();
            root = q.front();
         }
         else break;
      }
   }
   int insert(int v) {
      TreeNode* parent = q.front();
      TreeNode* temp = new TreeNode(v);
      q.push(temp);
      if(!parent->left){
         parent->left = temp;
      } else {
         q.pop();
         parent->right = temp;
      }
      return parent->val;
   }
   TreeNode* get_root() {
      return root;
   }
};
main(){
   vector<int> v = {1,2,3,4,5,6};
   TreeNode *root = make_tree(v);
   CBTInserter ob(root);
   cout << (ob.insert(7)) << endl;
   cout << (ob.insert(8)) << endl;
   tree_level_trav(ob.get_root());
}

ইনপুট

Initialize the tree as [1,2,3,4,5,6], then insert 7 and 8 into the tree, then find root

আউটপুট

3
4
[1, 2, 3, 4, 5, 6, 7, 8, ]

  1. C++ এ বাইনারি ট্রি প্রুনিং

  2. C++ এ সর্বাধিক বাইনারি ট্রি

  3. C++ এ সম্পূর্ণ ট্রি নোড গণনা করুন

  4. C++ এ বাইনারি ট্রি থেকে বাইনারি সার্চ ট্রি কনভার্সন