কম্পিউটার

C++ এ N-ary Tree থেকে Binary Tree এনকোড করুন


ধরুন আমাদের একটি N-ary গাছ আছে। আমাদের সেই গাছটিকে একটি বাইনারিতে এনকোড করতে হবে। বাইনারি ট্রিকে এন-আরি ট্রিতে ডিসিরিয়ালাইজ করার জন্যও আমাদের ডিসিরিয়ালাইজার তৈরি করতে হবে।

সুতরাং, যদি ইনপুট মত হয়

C++ এ N-ary Tree থেকে Binary Tree এনকোড করুন

তাহলে আউটপুট হবে

C++ এ N-ary Tree থেকে Binary Tree এনকোড করুন

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

  • একটি ফাংশন এনকোড সংজ্ঞায়িত করুন(), এটি রুট করবে,

  • রুট যদি বৈধ হয়, তাহলে −

    • রিটার্ন নাল

  • নোড =মূলের মান সহ নতুন ট্রি নোড

  • যদি মূলের বাচ্চাদের আকার 0 না হয়, তাহলে −

    • নোডের বাম :=এনকোড(শিশুদের[0] রুট)

  • curr =নোডের বাম

  • আরম্ভ করার জন্য i :=1, যখন i <রুটের বাচ্চাদের আকার, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −

    • নোডের অধিকার :=এনকোড(শিশুদের[i] রুট)

    • curr :=curr এর ডান

  • রিটার্ন নোড

  • একটি ফাংশন ডিকোড() সংজ্ঞায়িত করুন, এটি রুট করবে,

  • যদি root না থাকে, তাহলে −

    • NULL

      ফেরত দিন
  • নোড :=রুটের ভ্যাল সহ নতুন নোড

  • curr :=মূলের বাম

  • যখন curr অ-শূন্য হয়, −

    করুন
    • নোডের শিশুদের শেষে decode(curr) সন্নিবেশ করান

    • curr :=curr এর ডান

  • রিটার্ন নোড

উদাহরণ

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

#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 inord(TreeNode *root) {
   if (root != NULL) {
      inord(root->left);
      cout << root->val << " ";
      inord(root->right);
   }
}
class Node {
   public:
   int val;
   vector<Node*> children;
   Node() {}
   Node(int _val) {
      val = _val;
   }
   Node(int _val, vector<Node*> _children) {
      val = _val;
      children = _children;
   }
};
string n_ary_to_str(Node *root){
   string ret = "";
   if(root){
      ret = ret + to_string(root->val);
      if(root->children.size() > 0){
         ret += "[";
         for(Node* child : root->children){
            ret += n_ary_to_str(child) + ", ";
         }
         ret += "]";
      }
   }
   return ret;
}
class Codec {
public:
   TreeNode* encode(Node* root) {
      if(!root) return NULL;
         TreeNode* node = new TreeNode(root->val);
         if(root->children.size()){
            node->left = encode(root->children[0]);
         }
         TreeNode* curr = node->left;
         for(int i = 1; i < root->children.size(); i++){
            curr->right = encode(root->children[i]);
            curr = curr->right;
         }
         return node;
      }
      Node* decode(TreeNode* root) {
         if(!root) return NULL;
            Node* node = new Node(root->val);
         TreeNode* curr = root->left;
         while(curr){
            node->children.push_back(decode(curr));
            curr = curr->right;
         }
      return node;
   }
};
main() {
   Codec ob;
   Node n5(5), n6(6);
   Node n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6);
   Node n2(2), n4(4);
   Node n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2);
   n1.children.push_back(&n4);
   cout << "Given Tree: " << n_ary_to_str(&n1) << endl;
   cout << "Serialized Binary Tree: ";
   TreeNode *root = ob.encode(&n1);
   inord(root);
   cout << endl;
   Node *deser = ob.decode(root);
   cout << "Deserialized Tree: " << n_ary_to_str(deser);
}

ইনপুট

Node n5(5), n6(6);
Node n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6);
Node n2(2), n4(4);
Node n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2);
n1.children.push_back(&n4);

আউটপুট

Given Tree: 1[3[5, 6, ], 2, 4, ]
Serialized Binary Tree: 5 6 3 2 4 1
Deserialized Tree: 1[3[5, 6, ], 2, 4, ]

  1. C++ এ বাইনারি ট্রি ক্যামেরা

  2. C++ এ বাইনারি ট্রিতে একটি নোডের উত্তরসূরি

  3. C++ এ বাইনারি ট্রি-তে একটি নোডের প্রি-অর্ডার পূর্বসূরি

  4. C++ এ বাইনারি ট্রিতে একটি নোডের প্রি-অর্ডার উত্তরসূরি