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

C++ प्रोग्राम: जांचें कि क्या एक बाइनरी ट्री दूसरी बाइनरी ट्री का सबट्री है

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

एल्गोरिदम

शुरुआत
    function identical():
        दो नोड्स r1 और r2 को पैरामीटर के रूप में लें
        यदि r1 और r2 दोनों NULL हैं तो
            true लौटाएं
        यदि r1 या r2 NULL है तो
            false लौटाएं
        लौटाएं (r1->d, r2->d के बराबर है और
            identical(r1->l, r2->l) कॉल करें और
            identical(r1->r, r2->r) कॉल करें)
    
    function Subtree(node* T, node* S):
        if (S == NULL) तो
            return true
        if (T == NULL) तो
            return false
        if (Identical(T, S) कॉल करें)
            return true
        return Subtree(T->l, S) या Subtree(T->r, S)
समाप्ति

उदाहरण कोड

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

struct n {
    int d;
    struct n* l;
    struct n* r;
};

bool Identical(struct n* r1, struct n* r2) {
    if (r1 == NULL && r2 == NULL)
        return true;
    if (r1 == NULL || r2 == NULL)
        return false;
    return (r1->d == r2->d && Identical(r1->l, r2->l) && Identical(r1->r, r2->r));
}

bool Subtree(struct n* T, struct n* S) {
    if (S == NULL)
        return true;
    if (T == NULL)
        return false;
    if (Identical(T, S))
        return true;
    return Subtree(T->l, S) || Subtree(T->r, S);
}

struct n* newN(int d) {
    struct n* nod = (struct n*)malloc(sizeof(struct n));
    nod->d = d;
    nod->l = NULL;
    nod->r = NULL;
    return nod;
}

int main() {
    // ट्री T
    struct n* T = newN(24);
    T->r = newN(2);
    T->r->r = newN(5);
    T->l = newN(7);
    T->l->l = newN(3);
    T->l->l->r = newN(40);
    T->l->r = newN(6);
    
    // ट्री S
    struct n* S = newN(20);
    S->r = newN(5);
    S->l = newN(3);
    S->l->r = newN(50);
    
    if (Subtree(T, S))
        cout << "दिया गया ट्री बाइनरी ट्री का सबट्री है" << "\n";
    else
        cout << "दिया गया ट्री बाइनरी ट्री का सबट्री नहीं है" << "\n";
    
    // दूसरा टेस्ट केस
    struct n* T1 = newN(30);
    T1->r = newN(20);
    T1->r->r = newN(19);
    T1->l = newN(17);
    T1->l->l = newN(4);
    T1->l->l->r = newN(40);
    T1->l->r = newN(15);
    
    struct n* S1 = newN(17);
    S1->r = newN(15);
    S1->l = newN(4);
    S1->l->r = newN(40);
    
    if (Subtree(T1, S1))
        cout << "दिया गया ट्री बाइनरी ट्री का सबट्री है";
    else
        cout << "दिया गया ट्री बाइनरी ट्री का सबट्री नहीं है";
    
    return 0;
}

आउटपुट

दिया गया ट्री बाइनरी ट्री का सबट्री नहीं है
दिया गया ट्री बाइनरी ट्री का सबट्री है

ट्री संरचना

पहला टेस्ट केस - सबट्री नहीं

T:        24           S:      20
         /  \                /  \
        7    2              3    5
       / \   \            /  \
      3   6   5          50
       \
       40

S, T का सबट्री नहीं है क्योंकि मान अलग हैं (20 vs 7, 50 vs 40)

दूसरा टेस्ट केस - सबट्री है

T1:       30           S1:      17
         /  \                /  \
        17   20             4    15
       / \   \            /  \
      4  15  19          40
       \
       40

S1, T1 का सबट्री है (नोड 17 पर जड़ित)

समय जटिलता

  • O(m × n) जहां m = T का साइज़, n = S का साइज़
  • खराब केस: हर नोड पर identical() चेक होता है

ऑप्टिमाइज़ेशन

  • ट्री सीरियलाइज़ेशन + सबस्ट्रिंग सर्च (KMP): O(m + n)
  • हैशिंग (मर्कल ट्री): O(m + n) औसत
  1. C++ में बाइनरी ट्री की संपूर्णता जांचना C++ में बाइनरी ट्री की संपूर्णता जांचना

    मान लीजिए हमारे पास एक बाइनरी ट्री है। हमें जांचना है कि क्या यह ट्री एक पूर्ण बाइनरी ट्री (Complete Binary Tree) है या नहीं। लेवल n का एक पूर्ण बाइनरी ट्री में n-1 लेवल पूरी तरह भरे होते हैं, और लेवल n पर सभी नोड्स बाईं ओर से भरे होते हैं। उदाहरण: ट्री [1,2,3,4,5,6] के लिए आउटपुट true (1) होगा, क

  1. C++ में जांचें कि दिया गया बाइनरी ट्री सम-ट्री है या नहीं C++ में जांचें कि दिया गया बाइनरी ट्री सम-ट्री है या नहीं

    यहां हम देखेंगे कि बाइनरी ट्री सम-ट्री (SumTree) है या नहीं, इसकी जांच कैसे करें। अब सवाल यह है कि सम-ट्री क्या है। एक सम-ट्री एक बाइनरी ट्री है जहां एक नोड अपने बच्चों के योग का मान रखता है। ट्री का रूट उसके नीचे के सभी तत्वों का पूरा योग रखता है। यह सम-ट्री का एक उदाहरण है -इसे जांचने के लिए, हम ए

  1. C++ में जांचें कि बाइनरी ट्री किसी अन्य बाइनरी ट्री का सबट्री है या नहीं C++ में जांचें कि बाइनरी ट्री किसी अन्य बाइनरी ट्री का सबट्री है या नहीं

    मान लीजिए हमारे पास दो बाइनरी ट्री हैं। हमें जांचना है कि छोटा ट्री दूसरे बाइनरी ट्री का सबट्री है या नहीं। मान लीजिए ये दो ट्री दिए गए हैं।दो ट्री हैं। दूसरा ट्री पहले का सबट्री है। इस गुण की जांच करने के लिए, हम ट्री को पोस्ट-ऑर्डर फैशन में ट्रैवर्स करेंगे, फिर यदि इस नोड से रूटेड सबट्री दूसरे ट्र