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

C++ में दिए गए बाइनरी ट्री में सबसे बड़ा BST उपट्री खोजें - सेट 1


इस समस्या में, हमें एक बाइनरी ट्री BT दिया गया है। हमारा कार्य दिए गए बाइनरी ट्री में सबसे बड़ा BST उपट्री खोजना है।

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

बाइनरी सर्च ट्री (BST) एक ट्री है जिसमें सभी नोड्स नीचे उल्लिखित गुणों का पालन करते हैं −

  • बाएं उप-ट्री की कुंजी का मान उसके पैरेंट (रूट) नोड की कुंजी के मान से कम होता है।

  • दाएं उप-ट्री की कुंजी का मान उसके पैरेंट (रूट) नोड की कुंजी के मान से अधिक या बराबर होता है।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट :

C++ में दिए गए बाइनरी ट्री में सबसे बड़ा BST उपट्री खोजें - सेट 1

आउटपुट : 3

व्याख्या

पूर्ण बाइनरी ट्री एक BST है।

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

समस्या का एक सरल समाधान ट्री का इन-ऑर्डर ट्रैवर्सल करना है। और ट्री के प्रत्येक नोड के लिए, जांचें कि इसके उपट्री BST हैं या नहीं। अंत में सबसे बड़े उपट्री का आकार लौटाएं जो BST है।

उदाहरण

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम

#include<bits/stdc++.h> using namespace std; class node{    public:    int data;    node* left;    node* right;    node(int data){       this->data = data;       this->left = NULL;       this->right = NULL;    } }; int findTreeSize(node* node) {    if (node == NULL)       return 0;    else       return(findTreeSize(node->left) + findTreeSize(node->right) + 1); } int isBSTree(struct node* node) {    if (node == NULL)       return 1;    if (node->left != NULL && node->left->data > node->data)       return 0;    if (node->right != NULL && node->right->data < node->data)       return 0;    if (!isBSTree(node->left) || !isBSTree(node->right))       return 0;    return 1; } int findlargestBSTSize(struct node *root) {    if (isBSTree(root)){       return findTreeSize(root); } else    return max(findlargestBSTSize(root->left), findlargestBSTSize(root->right)); } int main() {    node *root = new node(5);    root->left = new node(2);    root->right = new node(8);    root->left->left = new node(1);    root->left->right = new node(4);    cout<<"सबसे बड़े संभावित BST का आकार है "<<findlargestBSTSize(root);    return 0; }

आउटपुट

सबसे बड़े संभावित BST का आकार है 5

एक अन्य दृष्टिकोण

समस्या का एक अन्य समाधान ट्री को नीचे से पार करना और इसके चाइल्ड नोड्स का उपयोग करके जांचना है कि यह BST है या नहीं। इसके लिए नोड के लिए, हम ट्रैक रखेंगे

यदि यह BST है या नहीं।

  • बाएं उप-ट्री के मामले में अधिकतम तत्व का मान।

  • दाएं उप-ट्री के मामले में न्यूनतम तत्व। इन मानों की तुलना वर्तमान नोड से BST की जांच के लिए करने की आवश्यकता है।

साथ ही, सबसे बड़े BST का आकार वर्तमान BST आकार के साथ जांच करके अपडेट किया जाएगा।

उदाहरण

#include<bits/stdc++.h> using namespace std; class node{    public:    int data;    node* left;    node* right;    node(int data){       this->data = data;       this->left = NULL;       this->right = NULL;    } }; int findlargestBSTSizeRec(node* node, int *minValRsubTree, int *maxValLsubTree, int *maxBSTSize, bool *isBSTree) {    if (node == NULL){       *isBSTree = true;       return 0;    }    int min = INT_MAX;    bool left_flag = false;    bool right_flag = false;    int leftSubtreeSize,rightSubTreeSize;    *maxValLsubTree = INT_MIN;    leftSubtreeSize = findlargestBSTSizeRec(node->left, minValRsubTree, maxValLsubTree, maxBSTSize, isBSTree);    if (*isBSTree == true && node->data > *maxValLsubTree)       left_flag = true;    min = *minValRsubTree;    *minValRsubTree = INT_MAX;    rightSubTreeSize = findlargestBSTSizeRec(node->right, minValRsubTree, maxValLsubTree, maxBSTSize, isBSTree);    if (*isBSTree == true && node->data < *minValRsubTree)       right_flag = true;    if (min < *minValRsubTree)       *minValRsubTree = min;    if (node->data < *minValRsubTree)       *minValRsubTree = node->data;    if (node->data > *maxValLsubTree)       *maxValLsubTree = node->data;    if(left_flag && right_flag){       if (leftSubtreeSize + rightSubTreeSize + 1 > *maxBSTSize)          *maxBSTSize = (leftSubtreeSize + rightSubTreeSize + 1);       return (leftSubtreeSize + rightSubTreeSize + 1);    }    else{     *isBSTree = false;       return 0; } } int findlargestBSTSize(node* node){ int min = INT_MAX; int max = INT_MIN; int largestBSTSize = 0; bool isBST = false; findlargestBSTSizeRec(node, &min, &max, &largestBSTSize, &isBST); return largestBSTSize; } int main(){ node *root = new node(5); root->left = new node(2); root->right = new node(8); root->left->left = new node(1); root->left->right = new node(4); cout<<"सबसे बड़े BST का आकार है "<<findlargestBSTSize(root); return 0; }

आउटपुट

सबसे बड़े BST का आकार है 5

  1. पायथन में दिए गए बाइनरी ट्री में BST का सबसे बड़ा योग मान ढूंढने का प्रोग्राम पायथन में दिए गए बाइनरी ट्री में BST का सबसे बड़ा योग मान ढूंढने का प्रोग्राम

    मान लीजिए हमें एक बाइनरी ट्री प्रदान की गई है। हमें यह ढूंढना है कि क्या उसके सबट्रीज में बाइनरी सर्च ट्री (BST) मौजूद हैं और सबसे बड़े BST का योग ढूंढना है। योग ढूंढने के लिए, हम उस BST में प्रत्येक नोड के मान जोड़ते हैं। हम आउटपुट के रूप में योग मान लौटाते हैं। इसलिए, यदि इनपुट है: तो आउटपुट 12

  1. पायथन में दिए गए बाइनरी ट्री में सबसे बड़ा पूर्ण उपट्री खोजें पायथन में दिए गए बाइनरी ट्री में सबसे बड़ा पूर्ण उपट्री खोजें

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें इस बाइनरी ट्री में अधिकतम पूर्ण उप-ट्री का आकार ढूंढना है। जैसा कि हम जानते हैं, एक पूर्ण बाइनरी ट्री वह बाइनरी ट्री है जहां सभी स्तर पूरी तरह भरे होते हैं, संभवतः अंतिम स्तर को छोड़कर, और अंतिम स्तर में सभी कुंजियां यथासंभव बाईं ओर होती हैं। इसलिए, यदि इ

  1. पायथन में दिए गए बाइनरी ट्री में सबसे बड़ा परफेक्ट सबट्री खोजें पायथन में दिए गए बाइनरी ट्री में सबसे बड़ा परफेक्ट सबट्री खोजें

    मान लीजिए हमारे पास एक दिया गया बाइनरी ट्री है; हमें उस दिए गए बाइनरी ट्री में सबसे बड़े परफेक्ट सब-ट्री का आकार ढूंढना है। जैसा कि हम जानते हैं, परफेक्ट बाइनरी ट्री एक बाइनरी ट्री है जिसमें सभी आंतरिक नोड्स के दो बच्चे होते हैं और सभी पत्ते समान स्तर पर होते हैं।तो, यदि इनपुट इस तरह है:तो आउटपुट 3