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

C++ में क्यू का उपयोग करके BST में एक पथ को उल्टा करना


एक बाइनरी सर्च ट्री दिया गया है, और हमें एक विशेष कुंजी से इसके पथ को उल्टा करना आवश्यक है, उदाहरण के लिए।

C++ में क्यू का उपयोग करके BST में एक पथ को उल्टा करना

C++ में क्यू का उपयोग करके BST में एक पथ को उल्टा करना

समाधान खोजने का दृष्टिकोण

इस दृष्टिकोण में, हम एक क्यू बनाएंगे और रूट मिलने तक सभी नोड्स को पुश करेंगे।

उदाहरण

#include <bits/stdc++.h>
using namespace std;

struct node {
    int key;
    struct node *left, *right;
};

struct node* newNode(int item){
    struct node* temp = new node;
    temp->key = item;
    temp->left = temp->right = NULL;
    return temp;
}

void inorder(struct node* root){
    if (root != NULL) {
        inorder(root->left);
        cout << root->key << " ";
        inorder(root->right);
    }
}

void Reversing(struct node** node, int& key, queue<int>& q1){
    /* यदि ट्री खाली है तो
    रिटर्न*/
    if (node == NULL)
        return;
    if ((*node)->key == key){ // यदि हमें कुंजी मिल जाती है
        q1.push((*node)->key); // हम इसे अपनी क्यू में पुश करते हैं
        (*node)->key = q1.front(); // हम वर्तमान के साथ पहली क्यू तत्व को बदलते हैं
        q1.pop(); // हम पहला तत्व पॉप करते हैं
    }
    else if (key < (*node)->key){ // यदि कुंजी वर्तमान नोड के मान से कम है
        q1.push((*node)->key); // हम तत्व को अपनी क्यू में पुश करते हैं
        Reversing(&(*node)->left, key, q1); // हम रिकर्सिव कॉल का उपयोग करके बाएं सबट्री में जाते हैं
        (*node)->key = q1.front(); // हम तत्वों को उल्टा करते हैं
        q1.pop(); // हम पहला तत्व पॉप करते हैं
    }
    else if (key > (*node)->key){ // यदि कुंजी नोड कुंजी से अधिक है तो
        q1.push((*node)->key); // हम नोड कुंजी को क्यू में पुश करते हैं
        Reversing(&(*node)->right, key, q1); // हम रिकर्सिव कॉल का उपयोग करके दाएं सबट्री में जाते हैं
        (*node)->key = q1.front(); // क्यू फ्रंट को नोड कुंजी से बदलें
        q1.pop(); // हम पहला तत्व पॉप करते हैं
    }
    return;
}

struct node* insert_node(struct node* node, // हमारे BST में नोड डालने का फंक्शन
    int key){
    if (node == NULL)
        return newNode(key); // यदि ट्री खाली है तो हम एक नया नोड रिटर्न करते हैं
    if (key < node->key) // अन्यथा हम इसे अपने ट्री में पुश करते हैं
        node->left = insert_node(node->left, key);
    else if (key > node->key)
        node->right = insert_node(node->right, key);
    return node; // नोड रिटर्न करना
}

int main(){
    struct node* root = NULL;
    queue<int> q1;
    int k = 80;
    /****************BST बनाना*************************/
    root = insert_node(root, 50);
    insert_node(root, 30);
    insert_node(root, 20);
    insert_node(root, 40);
    insert_node(root, 70);
    insert_node(root, 60);
    insert_node(root, 80);
    cout << "उल्टा करने से पहले :" << "\n";
    inorder(root);
    cout << "\n";
    Reversing(&root, k, q1);
    cout << "उल्टा करने के बाद :" << "\n";
    // रिवर्स पथ ट्री का इनऑर्डर प्रिंट करना
    inorder(root);
    return 0;
}

आउटपुट

उल्टा करने से पहले: 20 30 40 50 60 70 80
उल्टा करने के बाद: 20 30 40 80 60 70 50

उपरोक्त कोड की व्याख्या

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

निष्कर्ष

हम क्यू और रिकर्सन का उपयोग करके BST में एक पथ को उल्टा करने की समस्या को हल करते हैं। हमने इस समस्या के लिए C++ प्रोग्राम और इसे हल करने के पूर्ण दृष्टिकोण (सामान्य) को भी सीखा। हम इसी प्रोग्राम को C, Java, Python और अन्य भाषाओं में लिख सकते हैं। आशा है कि आपको यह ट्यूटोरियल मददगार लगा होगा।

  1. C++ में डबल लिंक्ड लिस्ट का उपयोग करके प्राथमिकता कतार C++ में डबल लिंक्ड लिस्ट का उपयोग करके प्राथमिकता कतार

    हमें डेटा और प्राथमिकता एक पूर्णांक मान के रूप में दी गई है और कार्य दिए गए प्राथमिकता के अनुसार डबल लिंक्ड लिस्ट बनाना और परिणाम प्रदर्शित करना है।कतार एक FIFO डेटा संरचना है जिसमें पहले डाला गया तत्व सबसे पहले हटाया जाता है। प्राथमिकता कतार एक प्रकार की कतार है जिसमें तत्वों को प्राथमिकता के आधार

  1. C/C++ में क्लाइंट-सर्वर मॉडल का उपयोग करके स्ट्रिंग रिवर्स करना C/C++ में क्लाइंट-सर्वर मॉडल का उपयोग करके स्ट्रिंग रिवर्स करना

    यहां हम एक ऐसा सिस्टम बनाएंगे जहां एक क्लाइंट और एक सर्वर होगा। क्लाइंट सर्वर को एक स्ट्रिंग भेजेगा, सर्वर उस स्ट्रिंग को रिवर्स करेगा और वापस क्लाइंट को भेज देगा। इसके लिए हम सॉकेट प्रोग्रामिंग की अवधारणा का उपयोग करेंगे। क्लाइंट-सर्वर कनेक्शन स्थापित करने के लिए हमें एक पोर्ट बनाना होगा। पोर्ट न

  1. - C++ में रिकर्सन का उपयोग करके वाक्य को उल्टा करने का प्रोग्राम

    एक स्ट्रिंग एक एक-आयामी कैरेक्टर सरणी है जो नल कैरेक्टर द्वारा समाप्त होती है। एक स्ट्रिंग का उल्टा वही स्ट्रिंग विपरीत क्रम में होता है। उदाहरण के लिए। मूल स्ट्रिंग: Apple is red उल्टी स्ट्रिंग: der si elppA एक प्रोग्राम जो स्ट्रिंग के रूप में वाक्य को रिकर्सन का उपयोग करके उल्टा करता है, निम्नलिखि