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

C++ में उलटा सबट्री


मान लीजिए कि हमारे पास दो बाइनरी ट्री हैं जिन्हें स्रोत और लक्ष्य कहा जाता है; हमें यह जांचना होगा कि क्या स्रोत का कुछ उलटा टी है जैसे कि यह लक्ष्य का एक उपप्रकार है। तो, इसका मतलब है कि लक्ष्य में एक नोड है जो मूल्यों और संरचना में समान रूप से T के समान है, जिसमें उसके सभी वंशज शामिल हैं।

जैसा कि हम जानते हैं कि एक पेड़ को दूसरे पेड़ का उलटा कहा जाता है यदि या तो -

  • दोनों पेड़ खाली हैं

  • इसके बाएँ और दाएँ बच्चे वैकल्पिक रूप से अदला-बदली किए जाते हैं और इसके बाएँ और दाएँ उपप्रकार व्युत्क्रम होते हैं।

तो, अगर इनपुट स्रोत की तरह है

C++ में उलटा सबट्री

लक्ष्य

C++ में उलटा सबट्री

तो आउटपुट सही होगा

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

  • फ़ंक्शन चेक () को परिभाषित करें, इसमें नोड 1, नोड 2,

    लगेगा
  • यदि नोड1 और नोड2 दोनों शून्य हैं, तो -

    • सही लौटें

  • यदि नोड1 या नोड2 उनमें से कोई एक रिक्त है, तो -

    • झूठी वापसी

  • यदि नोड1 का मान नोड2 के मान के बराबर नहीं है, तो -

    • झूठी वापसी

  • op1:=चेक (नोड 1 के बाएं, नोड 2 के बाएं) और चेक (नोड 1 के दाएं, नोड 2 के दाएं)

  • op2:=चेक (नोड 1 के दाएं, नोड 2 के बाएं) और चेक (नोड 1 के बाएं, नोड 2 के दाएं)

  • जब op1 और op2 में से कम से कम एक सत्य हो तो सही लौटें

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

  • अगर स्रोत और लक्ष्य खाली हैं, तो -

    • सही लौटें

  • यदि स्रोत या लक्ष्य उनमें से कोई एक शून्य है, तो -

    • झूठी वापसी

  • op1:=चेक (लक्ष्य, स्रोत)

  • यदि op1 सत्य है, तो -

    • सही लौटें

  • जब हल (स्रोत, लक्ष्य के बाएँ) या हल (स्रोत, लक्ष्य का दायाँ) में से कम से कम एक सही हो तो सही लौटें

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class TreeNode {
   public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data) {
      val = data;
      left = NULL;
      right = NULL;
   }
};
class Solution {
   public:
   bool check(TreeNode* node1, TreeNode* node2){
      if(!node1 && !node2)
      return true;
      if(!node1 || !node2)
      return false;
      if(node1->val != node2->val) {
         return false;
      }
      bool op1 = check(node1->left, node2->left) && check(node1->right, node2->right);
      bool op2 = check(node1->right, node2->left) && check(node1->left, node2->right);
      return op1 || op2;
   }
   bool solve(TreeNode* source, TreeNode* target) {
      if(!target && !source)
         return true;
      if(!target || !source)
         return false;
      bool op1 = check(target, source);
      if(op1)
         return true;
      return solve(source, target->left) || solve(source, target->right);
   }
};
main(){
   Solution ob;
   TreeNode *target = new TreeNode(6);
   target->left = new TreeNode(3);
   target->right = new TreeNode(1);
   target->right->left = new TreeNode(3);
   target->right->right = new TreeNode(2);
   target->right->right->left = new TreeNode(4);
   TreeNode *source = new TreeNode(1);
   source->left = new TreeNode(2);
   source->right = new TreeNode(3);
   source->left->right = new TreeNode(4);
   cout << (ob.solve(source, target));
}

इनपुट

TreeNode *target = new TreeNode(6);
target->left = new TreeNode(3);
target->right = new TreeNode(1);
target->right->left = new TreeNode(3);
target->right->right = new TreeNode(2);
target->right->right->left = new TreeNode(4);
TreeNode *source = new TreeNode(1);
source->left = new TreeNode(2);
source->right = new TreeNode(3);
source->left->right = new TreeNode(4);

आउटपुट

1

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

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

  1. C++ में बाइनरी ट्री में मैक्सिमम वैल्यू रूट्स की गणना करना

    मान लीजिए कि हमारे पास एक बाइनरी ट्री रूट है; हमें नोड्स की संख्या गिननी होगी जहां इसका मान इसके सभी वंशजों के मूल्यों से अधिक या बराबर है। तो, अगर इनपुट पसंद है तो आउटपुट 4 होगा क्योंकि 3 को छोड़कर सभी नोड्स, यह मानदंडों को पूरा करता है। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - फ़ंक

  1. जाँच करें कि क्या एक बाइनरी ट्री C++ में किसी अन्य बाइनरी ट्री का सबट्री है

    मान लीजिए कि हमारे पास दो बाइनरी ट्री हैं। हमें यह जांचना होगा कि छोटा पेड़ दूसरे बाइनरी ट्री का सबट्री है या नहीं। गौर कीजिए कि ये दो पेड़ दिए गए हैं। दो पेड़ हैं। दूसरा वृक्ष पहले वाले का उपवृक्ष है। इस संपत्ति की जांच करने के लिए, हम पेड़ को पोस्ट-ऑर्डर फैशन में पार करेंगे, फिर यदि इस नोड के स