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

C++ में रूट-टू-लीफ पथों पर लंबाई < K वाले नोड्स को हटाना


एक ट्री दिया गया है, और हमें दिए गए k से कम लंबाई वाले पथ के लीफ नोड को हटाने की आवश्यकता है, उदाहरण के लिए।

इनपुट -

K = 4.

C++ में रूट-टू-लीफ पथों पर लंबाई   K वाले नोड्स को हटाना

आउटपुट -

C++ में रूट-टू-लीफ पथों पर लंबाई   K वाले नोड्स को हटाना

व्याख्या

पथ थे:
1. A -> B -> C -> E लंबाई = 4
2. A -> B -> C -> F लंबाई = 4
3. A -> B -> D लंबाई = 3
4. A -> G -> H लंबाई = 3
5. A -> B -> I लंबाई = 3

अब जैसा कि आप देख सकते हैं पथ 3, 4, 5 की लंबाई 3 है जो दिए गए k से कम है इसलिए हम इन पथों के लीफ नोड्स को हटा देते हैं यानी D, H, I।
अब पथ 4 और 5 के लिए जब H और I हटा दिए जाते हैं तो हम देखते हैं कि अब G भी पथ लंबाई 2 के साथ एक लीफ नोड है इसलिए हम फिर से नोड G को हटा देते हैं और यहां हमारा प्रोग्राम समाप्त होता है।

हम ट्री को पोस्ट-ऑर्डर फॉर्मेट में ट्रैवर्स करेंगे; फिर, हम एक रिकर्सिव फंक्शन बनाते हैं जो हमारे लीफ नोड्स को हटा देता है यदि उनकी पथ लंबाई K से कम है।

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

इस दृष्टिकोण में, हम पोस्ट-ऑर्डर ट्रैवर्सल में ट्रैवर्स करते हैं; अब हम रिकर्सिवली उन लीफ नोड्स को हटाने का प्रयास करते हैं जिनकी पथ लंबाई k से कम है और इसी तरह जारी रखते हैं।

उदाहरण

उपरोक्त दृष्टिकोण के लिए C++ कोड

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

struct Node {
    // हमारे नोड की संरचना
    char data;
    Node *left, *right;
};

Node *newNode(int data) { // नया नोड डालना
    Node *node = new Node;
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

Node *trimmer(Node *root, int len, int k) {
    if (!root) // यदि रूट == NULL तो हम रिटर्न करते हैं
        return NULL;
    root->left = trimmer(root->left, len + 1, k); // बाएं चरण को ट्रैवर्स करना
    root->right = trimmer(root->right, len + 1, k); // दाएं चरण को ट्रैवर्स करना
    if (!root->left && !root->right && len < k) {
        delete root;
        return NULL;
    }
    return root;
}

Node *trim(Node *root, int k) {
    return trimmer(root, 1, k);
}

void printInorder(Node *root) {
    if (root) {
        printInorder(root->left);
        cout << root->data << " ";
        printInorder(root->right);
    }
}

int main() {
    int k = 4;
    Node *root = newNode('A');
    root->left = newNode('B');
    root->right = newNode('G');
    root->left->left = newNode('C');
    root->left->right = newNode('D');
    root->left->left->left = newNode('E');
    root->left->left->right = newNode('F');
    root->right->left = newNode('H');
    root->right->right = newNode('I');
    printInorder(root);
    cout << "\n";
    root = trim(root, k);
    printInorder(root);
    return 0;
}

आउटपुट

E C F B D A H G I E C F B A

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

इस कोड में, हम एक रिकर्सिव फंक्शन का उपयोग कर रहे हैं जो हमारे ट्री को ट्रैवर्स कर रहा है और बाएं और दाएं सबट्री के स्टैट्स को बनाए रख रहा है। अब हम एक लीफ नोड पर पहुंचते हैं; हम उस नोड तक पथ लंबाई की जांच करते हैं। यदि पथ लंबाई कम है, तो हम इस नोड को हटा देते हैं, और फिर हम NULL रिटर्न करते हैं; अन्यथा, कोड जारी रहता है।

निष्कर्ष

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

  1. C++ प्रोग्राम: पुनरावृत्ति के बिना रूट-टू-लीफ पथ प्रिंट करना C++ प्रोग्राम: पुनरावृत्ति के बिना रूट-टू-लीफ पथ प्रिंट करना

    इस ट्यूटोरियल में, हम दिए गए बाइनरी ट्री में रूट नोड से सभी पत्ती नोड्स तक के पथ को प्रिंट करने के प्रोग्राम पर चर्चा करेंगे। उदाहरण के लिए, मान लें हमारे पास निम्नलिखित बाइनरी ट्री है: इस बाइनरी ट्री में, हमारे पास 4 पत्ती नोड्स हैं। इसलिए रूट नोड से पत्ती नोड तक हमारे पास 4 पथ हो सकते हैं। इसे

  1. C++ प्रोग्राम: रिकर्सन के बिना रूट-टू-लीफ पथ प्रिंट करना C++ प्रोग्राम: रिकर्सन के बिना रूट-टू-लीफ पथ प्रिंट करना

    दिए गए बाइनरी ट्री में प्रोग्राम को रूट से लीफ तक के कई पथ ढूंढने होंगे जिसका अर्थ है सभी पथ प्रिंट होने चाहिए लेकिन चुनौती यह है कि रिकर्सन के बिना करना है। हम ट्री को पुनरावृत्त रूप से ट्रैवर्स करेंगे क्योंकि बाधा यह है कि इसे रिकर्सन के बिना करना है। इसलिए इसे प्राप्त करने के लिए हम एक STL मैप का

  1. पायथन में रूट टू लीफ पथ में अपर्याप्त नोड्स पायथन में रूट टू लीफ पथ में अपर्याप्त नोड्स

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