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

C++ . में समतुल्य बाइनरी ट्री फ्लिप करें

मान लीजिए कि हमारे पास एक बाइनरी ट्री है। हमें बाइनरी ट्री को पलटना है। फ्लिप इंगित करता है:कोई भी नोड चुनें, और बाएँ और दाएँ चाइल्ड सबट्री को स्वैप करें। अब एक बाइनरी ट्री एक्स एक बाइनरी ट्री वाई के बराबर फ्लिप है यदि और केवल अगर हम कुछ फ्लिप ऑपरेशन के बाद एक्स से वाई बना सकते हैं। हमें एक विधि लिखनी है जो यह निर्धारित करती है कि क्या दो बाइनरी ट्री फ्लिप समतुल्य हैं। पेड़ रूट नोड्स रूट 1 और रूट 2 द्वारा दिए गए हैं। तो अगर पेड़ हैं -

C++ . में समतुल्य बाइनरी ट्री फ्लिप करें


तब आउटपुट सही होगा, अगर हम 1, 3 और 5 के मान वाले नोड्स को फ्लिप करते हैं।

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

  • एक पुनरावर्ती फ़ंक्शन हल करें () को परिभाषित करें, इसमें दो पेड़ t1 और t2 लगेंगे।

  • यदि रूट1 और रूट2 शून्य हैं, तो सही लौटें

  • अन्यथा जब रूट 1 शून्य है या रूट 2 शून्य है, तो झूठी वापसी करें

  • अन्यथा जब (t1 और t2 दोनों में कोई लेफ्ट सबट्री नहीं है) या (t1 और t2 दोनों में लेफ्ट सबट्री है, और इन दोनों नोड्स के लेफ्ट सबट्री के मान समान हैं), तब

    • हल करें (रूट के बाएं, रूट 2 के बाएं) और हल करें (रूट के दाएं 1, रूट 2 के दाएं)

  • अन्यथा

    • हल करें (रूट का बायां, रूट का दायां 2) और हल करें (रूट का दायां 1, रूट 2 का बायां)

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

उदाहरण

#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;
}
class Solution {
   public:
   bool flipEquiv(TreeNode* root1, TreeNode* root2) {
      if(!root1 && !root2)return true;
      else if(!root1 || !root2)return false;
      else if(root1->val != root2->val) return false;
      else if((!root1->left && !root2->left) || (root1->left && root2->left && root1->left->val ==          root2-      >left->val)){
         return flipEquiv(root1->left, root2->left) && flipEquiv(root1->right, root2->right);
      }else{
         return flipEquiv(root1->left, root2->right) && flipEquiv(root1->right, root2->left);
      }
   }
};
main(){
   vector<int> v = {1,2,3,4,5,6,NULL,NULL,NULL,7,8};
   TreeNode *r1 = make_tree(v);
   vector<int> v1 = {1,3,2,NULL,6,4,5,NULL,NULL,NULL,NULL,NULL,NULL,8,7};
   TreeNode *r2 = make_tree(v);
   Solution ob;
   cout << (ob.flipEquiv(r1, r2));
}

इनपुट

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

आउटपुट

1

  1. C++ . में अद्वितीय बाइनरी सर्च ट्री

    मान लीजिए कि हमारे पास एक पूर्णांक n है, हमें सभी संरचनात्मक रूप से अद्वितीय बाइनरी सर्च ट्री को गिनना होगा जो 1 से n तक के मानों को संग्रहीत करते हैं। तो अगर इनपुट 3 है, तो आउटपुट 5 होगा, जैसे पेड़ होंगे - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - n + 1 आकार की एक सरणी बनाएं dp[0] :=1 i क

  1. C++ . में अद्वितीय बाइनरी सर्च ट्री II

    मान लीजिए कि हमारे पास एक पूर्णांक n है, हमें सभी संरचनात्मक रूप से अद्वितीय बाइनरी सर्च ट्री उत्पन्न करने होंगे जो 1 से n तक के मानों को संग्रहीत करते हैं। तो अगर इनपुट 3 है, तो पेड़ होंगे - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - जेनरेट () नामक एक पुनरावर्ती फ़ंक्शन को परिभाषित करें,

  1. C++ में दो बाइनरी ट्री मर्ज करें

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