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

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


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

आइए एक उदाहरण से समस्या को समझते हैं,

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

हमें 2 और 3 के बीच सभी नोड्स का XOR खोजने की आवश्यकता है।

2 से 3 तक का पथ, 2 → 6 → 1 → 3।

हम 2^3^1^3 खोजेंगे।

आउटपुट -

इस समस्या को हल करने के लिए, हमें एक नोड से दूसरे नोड तक के पथ खोजने की आवश्यकता है। इसके लिए, हम रूट से दोनों नोड्स तक के पथ में सभी नोड्स का XOR ढूंढेंगे। ऐसा करने पर रूट नोड से पार करते समय दो मामले होते हैं, या तो स्रोत और गंतव्य नोड दोनों रूट नोड के एक ही तरफ होते हैं या वे रूट नोड के अलग-अलग तरफ होते हैं। पहले मामले में, पथ में नहीं आने वाले सभी नोड्स दो बार पार किए जाएंगे और कैंसिल हो जाएंगे। और पूर्व मामले में रूट से नोड्स तक का पूरा पथ विचार करने की आवश्यकता है। प्रत्येक चरण में हम नोड का 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++ में बाइनरी ट्री में दो दिए गए लेवल के बीच सभी नोड्स प्रिंट करना C++ में बाइनरी ट्री में दो दिए गए लेवल के बीच सभी नोड्स प्रिंट करना

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

  1. बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में

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

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

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