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

C++ में किसी बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ का XOR

इस समस्या में हमें एक बाइनरी ट्री और बाइनरी ट्री के दो नोड दिए जाते हैं। हमारा काम दो नोड्स के बीच के रास्ते में आने वाले सभी नोड्स के XOR को प्रिंट करना है।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

C++ में किसी बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ का XOR

हमें 2 और 3 के बीच के सभी नोड्स के xor को खोजने की जरूरत है।

2 से 3 तक का रास्ता, 2 → 6 → 1 → 3.

हमें 2^3^1^3 मिलेगा।

आउटपुट -

इस समस्या को हल करने के लिए, हमें एक से दूसरे नोड तक के रास्ते खोजने होंगे। ऐसा करने के लिए, हम रूट से दोनों नोड्स के रास्ते में सभी नोड्स के एक्सओआर पाएंगे। ऐसा करने पर रूट नोड से ट्रैवर्स करते समय दो मामले होते हैं, या तो स्रोत और गंतव्य नोड दोनों रूट नोड के एक ही तरफ स्थित होते हैं या वे रूट नोड के विभिन्न किनारों पर स्थित होते हैं। पहले मामले में, रास्ते में नहीं आने वाले सभी नोड्स को दो बार ट्रैवर्स किया जाएगा और रद्द कर दिया जाएगा। और पूर्व मामले में रूट से नोड्स तक पूरे पथ पर विचार करने की आवश्यकता है। प्रत्येक चरण में हम पिछले पाए गए XOR परिणाम के साथ नोड का XOR पाएंगे, इससे स्थान की बचत होगी।

उदाहरण

हमारे समाधान के कार्यान्वयन को दिखाने के लिए कार्यक्रम,

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   Node *left, *right;
};
struct Node* getNode(int data){
   struct Node* newNode = new Node;
   newNode->data = data;
   newNode->left = newNode->right = NULL;
   return newNode;
}
void pathStoD(Node* root, unordered_map<int, int>& path, int XOR){
   if (!root)
      return;
   path.insert(make_pair(root->data, XOR ^ root->data));
   XOR ^= root->data;
   if (root->left)
      pathStoD(root->left, path, XOR);
   if (root->right)
      pathStoD(root->right, path, XOR);
}
int findPathXOR(unordered_map<int, int> path, int node1, int node2){
   return path[node1] ^ path[node2];
}
int main(){
   struct Node* root = getNode(1);
   root->left = getNode(6);
   root->left->left = getNode(2);
   root->left->right = getNode(4);
   root->right = getNode(3);
   root->right->left = getNode(7);
   root->right->right = getNode(5);
   int XOR = 0;
   unordered_map<int, int> mp;
   int source = 2;
   int destination = 3;
   pathStoD(root, mp, XOR);
   cout<<"The XOR of all node from "<<source<<" to "<<destination<<" of the tree is : ";
   cout<<findPathXOR(mp, source, destination);
   return 0;
}

आउटपुट

The XOR of all node from 2 to 3 of the tree is : 7

  1. C++ में बाइनरी ट्री में दो दिए गए स्तरों के बीच सभी नोड्स प्रिंट करें

    इस समस्या में, हमें एक बाइनरी ट्री और ट्री में दो लेवल (ऊपरी और निचले) दिए जाते हैं और हमें ट्री के ऊपरी और निचले स्तरों के बीच सभी नोड्स को प्रिंट करना होता है। बाइनरी ट्री एक विशेष पेड़ है जिसके प्रत्येक नोड में अधिकतम दो नोड (एक/दो/कोई नहीं) होते हैं। आइए समस्या को समझने के लिए एक उदाहरण लेते ह

  1. C++ में एक बाइनरी ट्री के दो नोड्स के बीच की दूरी का पता लगाएं

    मान लें कि हमारे पास कुछ नोड्स के साथ एक बाइनरी ट्री है। हमें दो नोड्स u और v के बीच की दूरी ज्ञात करनी है। मान लीजिए कि पेड़ नीचे जैसा है - अब (4, 6) =4 के बीच की दूरी, पथ की लंबाई 4 है, (5, 8) के बीच की लंबाई =5 आदि। इस समस्या को हल करने के लिए, हम एलसीए (सबसे कम सामान्य पूर्वज) ढूंढेंगे, फिर

  1. C++ प्रोग्रामिंग में बाइनरी ट्री में किन्हीं दो नोड्स के बीच प्रिंट पथ।

    हमें अलग-अलग नोड्स के एक बाइनरी ट्री और बाइनरी ट्री के दो नोड्स दिए गए हैं, जिसका बाइनरी ट्री में पथ हम प्रिंट करना चाहते हैं। उदाहरण के लिए - हम नोड 140 से 211 के बीच के पाथ को प्रिंट करना चाहते हैं, इसलिए इसका आउटपुट इस तरह होना चाहिए - Output: 140->3->10->211 विचार दो नोड्स के लिए रू