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

C++ में बाइनरी ट्री को थ्रेडेड बाइनरी ट्री में बदलें | सेट 1 (क्यू का उपयोग करके)


इस ट्यूटोरियल में, हम एक प्रोग्राम पर चर्चा करेंगे जो क्यू डेटा संरचना का उपयोग करके बाइनरी ट्री को थ्रेडेड बाइनरी ट्री में परिवर्तित करता है।

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

उदाहरण

#include <iostream>
#include <queue>
using namespace std;

// थ्रेडेड ट्री के लिए नोड संरचना
struct Node {
    int key;
    Node *left, *right;
    bool isThreaded;
};

// इनऑर्डर पैटर्न को क्यू में डालना
void convert_queue(Node* root, std::queue<Node*>* q) {
    if (root == NULL)
        return;
    if (root->left)
        convert_queue(root->left, q);
    q->push(root);
    if (root->right)
        convert_queue(root->right, q);
}

// क्यू को पार करके थ्रेडेड ट्री बनाना
void create_threadedtree(Node* root, std::queue<Node*>* q) {
    if (root == NULL)
        return;
    if (root->left)
        create_threadedtree(root->left, q);
    q->pop();
    if (root->right)
        create_threadedtree(root->right, q);
    // यदि राइट पॉइंटर NULL है, तो इसे इनऑर्डर सक्सेसर पर इंगित करें
    else {
        root->right = q->front();
        root->isThreaded = true;
    }
}

// अंत में ट्री लेकर उसे थ्रेडेड में बदलना
void createThreaded(Node* root) {
    std::queue<Node*> q;
    convert_queue(root, &q);
    create_threadedtree(root, &q);
}

Node* leftMost(Node* root) {
    while (root != NULL && root->left != NULL)
        root = root->left;
    return root;
}

// थ्रेडेड ट्री का इनऑर्डर ट्रैवर्सल करना
void inOrder(Node* root) {
    if (root == NULL)
        return;
    Node* cur = leftMost(root);
    while (cur != NULL) {
        cout << cur->key << " ";
        // यदि थ्रेडेड नोड है, तो इनऑर्डर सक्सेसर पर जाएं
        if (cur->isThreaded)
            cur = cur->right;
        else
            cur = leftMost(cur->right);
    }
}

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

int main() {
    Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    root->right->left = newNode(6);
    root->right->right = newNode(7);
    createThreaded(root);
    cout << "Traversing threaded tree:\n";
    inOrder(root);
    return 0;
}

आउटपुट

Traversing threaded tree: 4 2 5 1 6 3 7
  1. C++ में अधिकतम बाइनरी ट्री II C++ में अधिकतम बाइनरी ट्री II

    मान लीजिए हमारे पास एक अधिकतम ट्री का रूट नोड है: अधिकतम ट्री एक ट्री है जहां प्रत्येक नोड का मान उसके सबट्री में किसी भी अन्य मान से अधिक होता है। मान लीजिए हमारे पास construct() नामक एक विधि है। यह सूची A से एक रूट बना सकती है। construct() विधि इस तरह है: यदि सूची A खाली है, तो null लौटाएं। अन्य

  1. C++ में बाइनरी ट्री को लिंक्ड लिस्ट में फ्लैट करना C++ में बाइनरी ट्री को लिंक्ड लिस्ट में फ्लैट करना

    मान लीजिए हमारे पास एक बाइनरी ट्री है। हमें इसे स्थानांतरित (in-place) करके लिंक्ड लिस्ट में बदलना है (दायाँ पॉइंटर अगले नोड को इंगित करे, बायाँ पॉइंटर null हो)। उदाहरण: ट्री [1,2,5,3,4] → फ्लैट लिस्ट: 1→2→3→4→5 (प्रीऑर्डर ट्रैवर्सल क्रम)। रिवर्स प्रीऑर्डर ट्रैवर्सल ग्लोबल prev = null रखें। रिकर

  1. C++ में बाइनरी ट्री का लेवल ऑर्डर ट्रैवर्सल (Binary Tree Level Order Traversal) C++ में बाइनरी ट्री का लेवल ऑर्डर ट्रैवर्सल (Binary Tree Level Order Traversal)

    मान लीजिए हमारे पास एक बाइनरी ट्री है। हमें इस ट्री को लेवल ऑर्डर ट्रैवर्सल योजना का उपयोग करके पार करना है। यदि ट्री इस तरह है: ट्रैवर्सल अनुक्रम इस तरह होगा: [10, 5, 16, 8, 15, 20, 23] इसे हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे: नोड्स संग्रहीत करने के लिए कतार que परिभाषित करें रूट क