Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में बाइनरी ट्री को सीरियलाइज़ और डिसेरिएलाइज़ करें

मान लीजिए कि हमारे पास एक बाइनरी ट्री है और हमें उन्हें क्रमबद्ध और डिसेरिएलाइज़ करना है। जैसा कि हम जानते हैं कि क्रमांकन डेटा संरचना या ऑब्जेक्ट को बिट्स के अनुक्रम में परिवर्तित करने की प्रक्रिया है, इसलिए हम उन्हें एक फ़ाइल या मेमोरी बफर में स्टोर कर सकते हैं, और जिसे बाद में उसी या किसी अन्य कंप्यूटर वातावरण में फिर से बनाया जा सकता है।

यहां हमें बाइनरी ट्री को क्रमबद्ध और अक्रमांकन करने के लिए एक एल्गोरिथ्म तैयार करना होगा। बाइनरी ट्री एक जड़ वाला पेड़ है जिसमें प्रत्येक नोड में 2 से अधिक बच्चे नहीं होते हैं।

तो, अगर इनपुट पसंद है


सी ++ में बाइनरी ट्री को सीरियलाइज़ और डिसेरिएलाइज़ करें

तो आउटपुट सीरियलाइज होगा - 1 2 3 4 5 एन एन एन एन एन एन डीसेरियलाइज्ड ट्री:4 2 5 1 3.

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक फ़ंक्शन को परिभाषित करें serialize(), यह जड़ लेगा,

  • रिट:=खाली स्ट्रिंग

  • एक कतार को परिभाषित करें q

  • q में रूट डालें

  • जबकि (नहीं q खाली है), करें -

    • curr =q का पहला तत्व

    • q से तत्व हटाएं

    • अगर कर्व उपलब्ध नहीं है, तो -

      • ret :=ret concatenate "N"

      • ret :=ret concatenate रिक्त स्थान

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • रिट:=रेट + कर्व का मूल्य

    • रिट :=रिट + रिक्त स्थान

    • q के अंत में curr के बाएँ

    • q के अंत में curr का अधिकार

  • वापसी रिट

  • एक फ़ंक्शन को परिभाषित करें deserialize(), यह डेटा लेगा,

  • अगर डेटा [0] 'एन' के समान है, तो -

    • वापसी शून्य

  • अस्थायी:=खाली स्ट्रिंग

  • सरणी को परिभाषित करें v

  • इनिशियलाइज़ i :=0 के लिए, जब i - डेटा का आकार, अपडेट (i से 1 की वृद्धि), करें -

    • यदि डेटा [i] रिक्त स्थान के समान है, तो -

      • v के अंत में अस्थायी डालें

      • अस्थायी:=रिक्त स्ट्रिंग

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • अस्थायी:=अस्थायी + डेटा [i]

  • newRoot =नया नोड v[0]

    . के साथ
  • एक कतार को परिभाषित करें q

  • q में newRoot डालें

  • मैं :=1

  • जबकि (नहीं q खाली है और i

    • पैरेंट =q का पहला तत्व

    • q से तत्व हटाएं

    • अगर v[i] "N" के बराबर नहीं है, तो -

      • माता-पिता के बाईं ओर:=नया नोड v[i]

        . के साथ
      • माता-पिता के बाईं ओर q में डालें

    • (मैं 1 से बढ़ाइए)

    • अगर v[i] "N" के बराबर नहीं है, तो -

      • माता-पिता का अधिकार:=नया नोड v[i]

        . के साथ
      • माता-पिता के अधिकार को q में डालें

    • (मैं 1 से बढ़ाइए)

  • नया रूट लौटाएं

उदाहरण

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#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 inord(TreeNode *root) {
   if (root != NULL) {
      inord(root->left);
      cout << root->val << " ";
      inord(root->right);
   }
}
class Codec {
public:
   string serialize(TreeNode *root) {
      string ret = "";
      queue<TreeNode *> q;
      q.push(root);
      while (!q.empty()) {
         TreeNode *curr = q.front();
         q.pop();
         if (!curr) {
            ret += "N";
            ret += " ";
            continue;
         }
         ret += to_string(curr->val);
         ret += " ";
         q.push(curr->left);
         q.push(curr->right);
      }
      return ret;
   }
   TreeNode *deserialize(string data) {
      if (data[0] == 'N')
         return NULL;
      string temp = "";
      vector<string> v;
      for (int i = 0; i < data.size(); i++) {
         if (data[i] == ' ') {
            v.push_back(temp);
            temp = "";
            continue;
         }
         temp += data[i];
      }
      TreeNode *newRoot = new TreeNode(stoi(v[0]));
      queue<TreeNode *> q;
      q.push(newRoot);
      int i = 1;
      while (!q.empty() && i < v.size()) {
         TreeNode *parent = q.front();
         q.pop();
         if (v[i] != "N") {
            parent->left = new TreeNode(stoi(v[i]));
            q.push(parent->left);
         }
         i++;
         if (v[i] != "N") {
            parent->right = new TreeNode(stoi(v[i]));
            q.push(parent->right);
         }
         i++;
      }
      return newRoot;
   }
};
main() {
   Codec ob;
   vector<int> v = {1,2,3,4,5};
   TreeNode *root = make_tree(v);
   cout << "Given Tree: ";
   inord(root);
   cout << endl;
   string ser = ob.serialize(root);
   cout << "Serialize: " << ser << endl;
   TreeNode *deser = ob.deserialize(ser);
   cout << "Deserialized Tree: ";
   inord(root);
}

इनपुट

1,2,3,4,5

आउटपुट

Given Tree: 4 2 5 1 3
Serialize: 1 2 3 4 5 N N N N N N
Deserialized Tree: 4 2 5 1 3

  1. C++ में बाइनरी ट्री प्रूनिंग

    मान लीजिए कि हमारे पास एक बाइनरी ट्री का हेड नोड रूट है, जहां अतिरिक्त रूप से प्रत्येक नोड का मान या तो 0 या 1 है। हमें वही ट्री ढूंढना है जहां प्रत्येक सबट्री जिसमें 1 नहीं है, को हटा दिया गया है। तो अगर पेड़ जैसा है - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक पुनरावर्ती विधि को

  1. C++ में अधिकतम बाइनरी ट्री

    मान लीजिए कि हमारे पास एक पूर्णांक सरणी है। उस सरणी के सभी तत्व अद्वितीय हैं। इस सरणी पर अधिकतम वृक्ष निर्माण को निम्नानुसार परिभाषित किया गया है - जड़ सरणी में अधिकतम संख्या धारण करेगा। लेफ्ट सबट्री सबएरे के बायीं ओर से निर्मित अधिकतम ट्री है जिसे अधिकतम संख्या से विभाजित किया जाता है। दाय

  1. C++ में बाइनरी ट्री टू बाइनरी सर्च ट्री रूपांतरण

    एक बाइनरी ट्री एक विशेष प्रकार का पेड़ है जिसमें पेड़ के प्रत्येक नोड में अधिकतम दो बच्चे नोड हो सकते हैं। इन चाइल्ड नोड्स को राइट चाइल्ड और लेफ्ट चाइल्ड के रूप में जाना जाता है। एक साधारण बाइनरी ट्री है - बाइनरी सर्च ट्री (BST) एक विशेष प्रकार का वृक्ष है जो निम्नलिखित नियमों का पालन करता है -