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

सी++ में सबसे बड़ा बीएसटी सबट्री

मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें इसका सबसे बड़ा सबट्री ढूंढ़ना होगा जहां सबसे बड़ा मतलब सबट्री जिसमें सबसे बड़ी संख्या में नोड्स हों।

तो, अगर इनपुट पसंद है,

सी++ में सबसे बड़ा बीएसटी सबट्री

तो आउटपुट 3 होगा, क्योंकि इस मामले में सबसे बड़ा बीएसटी सबट्री हाइलाइट किया गया है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • डेटा नामक एक संरचना को परिभाषित करें, चार मान होंगे, आकार, मैक्सवैल, मिनवैल, और ओके, ओके केवल सही/गलत मान रख सकता है

  • हल करें (ट्रीनोड * नोड)

  • यदि नोड शून्य है, तो &miuns;

    • प्रारंभ करके डेटा लौटाएं (0, अनंत, -अनंत, सत्य)

  • बाएं:=हल करें (नोड के बाएं)

  • बाएं:=हल करें (नोड के दाएं)

  • एक डेटा को परिभाषित करें जिसे curr कहा जाता है

  • curr.ok :=false

  • यदि नोड का मान>=right.minVal, तो -

    • वापसी वक्र

  • यदि नोड का मान <=left.maxVal है, तो -

    • वापसी वक्र

  • अगर लेफ्ट.ओके सच है और राइट.ओके सच है, तो -

    • curr.sz :=1 + left.sz + right.sz

    • curr.ok :=सच

    • curr.maxVal :=अधिकतम (नोड का मान और right.maxVal)

    • curr.minVal :=अधिकतम (नोड का मान और बायां.मिनवैल)

  • अगर curr.ok सच है, तो -

    • ret :=अधिकतम ret और curr.sz

    • वापसी वक्र

  • मुख्य विधि से, निम्न कार्य करें -

  • रिट:=0

  • हल (रूट)

  • वापसी रिट

उदाहरण

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = NULL;
      right = NULL;
   }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
      }
      else{
         q.push(temp->left);
      }
      if(!temp->right){
         if(val != NULL)
            temp->right = new TreeNode(val);
         else
            temp->right = new TreeNode(0);
         return;
      }
      else{
         q.push(temp->right);
      }
   }
}
TreeNode *make_tree(vector<int< v){
   TreeNode *root = new TreeNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
struct Data{
   int sz;
   int maxVal;
   int minVal;
   bool ok;
   Data(){}
   Data(int a, int b, int c, bool d){
      sz = a;
      minVal = b;
      maxVal = c;
      ok = d;
   }
};
class Solution {
public:
   int ret;
   Data solve(TreeNode* node){
      if (!node)
         return Data(0, INT_MAX, INT_MIN, true);
      Data left = solve(node->left);
      Data right = solve(node->right);
      Data curr;
      curr.ok = false;
      if (node->val >= right.minVal) {
         return curr;
      }
      if (node->val <= left.maxVal) {
         return curr;
      }
      if (left.ok && right.ok) {
         curr.sz = 1 + left.sz + right.sz;
         curr.ok = true;
         curr.maxVal = max(node->val, right.maxVal);
         curr.minVal = min(node->val, left.minVal);
      }
      if (curr.ok)
         ret = max(ret, curr.sz);
      return curr;
   }
   int largestBSTSubtree(TreeNode* root){
      ret = 0;
      solve(root);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int< v = {10,5,15,1,8,NULL,7};
   TreeNode *root= make_tree(v);
   cout << (ob.largestBSTSubtree(root));
}

इनपुट

[10,5,15,1,8,null,7]

आउटपुट

3

  1. C++ में उलटा सबट्री

    मान लीजिए कि हमारे पास दो बाइनरी ट्री हैं जिन्हें स्रोत और लक्ष्य कहा जाता है; हमें यह जांचना होगा कि क्या स्रोत का कुछ उलटा टी है जैसे कि यह लक्ष्य का एक उपप्रकार है। तो, इसका मतलब है कि लक्ष्य में एक नोड है जो मूल्यों और संरचना में समान रूप से T के समान है, जिसमें उसके सभी वंशज शामिल हैं। जैसा कि

  1. दो योग IV - इनपुट C++ में एक BST है

    मान लीजिए हमारे पास एक बाइनरी सर्च ट्री और एक लक्ष्य मान है; हमें यह जांचना होगा कि क्या बीएसटी में दो तत्व मौजूद हैं जैसे कि उनका योग दिए गए लक्ष्य के बराबर है या नहीं। तो, अगर इनपुट पसंद है तो आउटपुट ट्रू होगा। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - सरणी को परिभाषित करें v एक

  1. C++ में BST को ग्रेटर ट्री में बदलें

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