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

C++ प्रोग्राम: बाइनरी ट्री में सबसे गहरा लेफ्ट लीफ ढूंढना

एक बाइनरी ट्री जिसमें अधिकतम दो बच्चे होते हैं, जिन्हें लेफ्ट चाइल्ड और राइट चाइल्ड के रूप में निर्दिष्ट किया जाता है। यह बाइनरी ट्री में सबसे गहरा लेफ्ट लीफ ढूंढने का C++ प्रोग्राम है।

एल्गोरिदम

शुरुआत
    deepestLLeafutil() फ़ंक्शन दिए गए बाइनरी ट्री में सबसे गहरा लेफ्ट लीफ ढूंढता है:
        lvel वर्तमान नोड का लेवल है
        maxlvel अब तक मिले सबसे गहरे लेफ्ट लीफ नोड का पॉइंटर है
        isLeft इंगित करता है कि यह नोड अपने पैरेंट का लेफ्ट चाइल्ड है
        resPtr रिजल्ट का पॉइंटर है
        यदि रूट NULL के बराबर है तो
            लौटें
        रिजल्ट अपडेट करें यदि यह नोड लेफ्ट लीफ है और इसका लेवल वर्तमान रिजल्ट के मैक्स लेवल से अधिक है
        लेफ्ट और राइट सबट्रीज के लिए deepestLLeafutil() फ़ंक्शन को रिकर्सिवली कॉल करें
समाप्ति

उदाहरण कोड

#include <iostream>
using namespace std;

struct n {
    int v;
    n *l, *r;
};

void deepestLLeafutil(n* root, int lvel, int* maxvel, bool isLeft, n** resPtr) {
    if (root == NULL)
        return;
    if (isLeft && !root->l && !root->r && lvel > *maxvel) {
        *resPtr = root;
        *maxvel = lvel;
        return;
    }
    deepestLLeafutil(root->l, lvel + 1, maxvel, true, resPtr);
    deepestLLeafutil(root->r, lvel + 1, maxvel, false, resPtr);
}

n* deepestLLeaf(n* root) {
    int maxlevel = 0;
    n* res = NULL;
    deepestLLeafutil(root, 0, &maxlevel, false, &res);
    return res;
}

n* newnode(int d) {
    n* t = new n;
    t->v = d;
    t->l = t->r = NULL;
    return t;
}

int main() {
    n* root = newnode(9);
    root->l = newnode(7);
    root->r = newnode(10);
    root->l->l = newnode(6);
    root->r->l = newnode(8);
    root->r->r = newnode(19);
    root->r->l->r = newnode(4);
    root->r->r->r = newnode(20);
    
    n* res = deepestLLeaf(root);
    if (res)
        cout << "सबसे गहरा लेफ्ट लीफ है " << res->v;
    else
        cout << "दिए गए ट्री में कोई लेफ्ट लीफ नहीं है";
    return 0;
}

आउटपुट

सबसे गहरा लेफ्ट लीफ है 6

ट्री संरचना

        9
       /  \
      7    10
     /    /  \
    6    8    19
         \     \
          4     20

लेफ्ट लीफ्स: 6 (लेवल 2), 4 (लेवल 3) - लेकिन 4 राइट चाइल्ड है 8 का, इसलिए लेफ्ट लीफ नहीं। केवल 6 लेफ्ट लीफ है।

एल्गोरिदम व्याख्या

  • isLeft पैरामीटर ट्रैक करता है कि नोड अपने पैरेंट का लेफ्ट चाइल्ड है या नहीं
  • लीफ चेक: !root->l && !root->r - दोनों चाइल्ड NULL हैं
  • लेवल ट्रैकिंग: प्रत्येक रिकर्सिव कॉल पर लेवल बढ़ता है
  • मैक्स लेवल अपडेट: केवल तब जब नया लेफ्ट लीफ गहरा मिले

समय जटिलता

  • O(n) - प्रत्येक नोड एक बार विजिट होता है
  • स्पेस: O(h) - रिकर्सन स्टैक, h = ट्री की ऊंचाई
  1. बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में

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

  1. C++ प्रोग्राम: बाइनरी सर्च ट्री पर लेफ्ट रोटेशन करना C++ प्रोग्राम: बाइनरी सर्च ट्री पर लेफ्ट रोटेशन करना

    एक बाइनरी सर्च ट्री एक सॉर्टेड बाइनरी ट्री है जिसमें सभी नोड्स में निम्नलिखित दो गुण होते हैं - एक नोड का राइट सब-ट्री उसके पैरेंट नोड की कुंजी से अधिक सभी कुंजियों को रखता है। एक नोड का लेफ्ट सब-ट्री उसके पैरेंट नोड की कुंजी से कम सभी कुंजियों को रखता है। प्रत्येक नोड में दो से अधिक चाइल्ड नहीं हो

  1. पायथन में बाइनरी ट्री पर k-लंबाई के पथ खोजने का प्रोग्राम पायथन में बाइनरी ट्री पर k-लंबाई के पथ खोजने का प्रोग्राम

    मान लीजिए हमारे पास एक बाइनरी ट्री है जिसमें अद्वितीय मान हैं और हमारे पास एक अन्य मान k है, हमें ट्री में k-लंबाई के अद्वितीय पथों की संख्या ढूंढनी है। पथ पैरेंट से चाइल्ड या चाइल्ड से पैरेंट की ओर जा सकते हैं। हम दो पथों को अलग मानेंगे जब कोई नोड एक पथ में दिखाई देता है लेकिन दूसरे में नहीं। उदाह