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

C++ में बाइनरी ट्री में अधिकतम योग BST

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

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

C++ में बाइनरी ट्री में अधिकतम योग BST

तो आउटपुट 20 होगा, यह चयनित बीएसटी में सभी नोड्स का योग है।

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

  • डेटा नामक एक ब्लॉक बनाएं, इसमें sz, maxVal, minVal, ok, sum जैसे कुछ सदस्य होंगे। डेटा के लिए एक इनिशियलाइज़र भी परिभाषित करें, जो इस क्रम में ले जाएगा (sz, minVal, maxVal, ok, और set sum as 0)

  • रिट:=0

  • हल () नामक एक विधि को परिभाषित करें, यह पेड़ की जड़ लेगा

  • यदि नोड शून्य नहीं है या नोड का मान 0 के समान है, तो -

    • एक नया डेटा लौटाएं और इसे (0, inf, -inf, true) द्वारा प्रारंभ करें

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

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

  • एक डेटा प्रकार का उदाहरण बनाएं जिसे curr कहा जाता है

  • curr.ok :=false

  • अगर नोड -> वैल>=right.minVal, तो -

    • वापसी वक्र

  • अगर नोड -> वैल <=left.maxVal, तो -

    • वापसी वक्र

  • अगर लेफ्ट.ओके नॉन-जीरो है और राइट.ओके नॉन-जीरो है, तो -

    • curr.sum :=वैल + left.sum + right.sum of node

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

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

    • curr.ok :=सच

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

    • curr.minVal :=अधिकतम नोड मान और left.minVal

  • वापसी वक्र

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

  • रिट:=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;
   int sum;
   Data(){}
   Data(int a, int b, int c, bool d){
      sz = a;
      minVal = b;
      maxVal = c;
      ok = d;
      sum = 0;
   }
};
class Solution {
   public:
   int ret = 0;
   Data solve(TreeNode* node){
      if (!node || node->val == 0)
      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.sum = node->val + left.sum + right.sum;
         ret = max(curr.sum, ret);
         curr.sz = 1 + left.sz + right.sz;
         curr.ok = true;
         curr.maxVal = max(node->val, right.maxVal);
         curr.minVal = min(node->val, left.minVal);
      }
      return curr;
   }
   int maxSumBST(TreeNode* root){
      ret = 0;
      solve(root);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v =
   {1,4,3,2,4,2,5,NULL,NULL,NULL,NULL,NULL,NULL,4,6};
   TreeNode *root = make_tree(v);
   cout << (ob.maxSumBST(root));
}

इनपुट

{1,4,3,2,4,2,5,NULL,NULL,NULL,NULL,NULL,NULL,4,6}

आउटपुट

20

  1. C++ में बाइनरी ट्री में अधिकतम सर्पिल योग

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

  1. C++ में एक बाइनरी ट्री में अधिकतम पथ योग

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

  1. C++ में बाइनरी ट्री में अधिकतम लम्बवत योग ज्ञात कीजिए

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है। कार्य ऊर्ध्वाधर क्रम ट्रैवर्सल में सभी नोड्स के अधिकतम योग को प्रिंट करना है। तो अगर पेड़ नीचे जैसा है - लंबवत क्रम ट्रैवर्सल इस प्रकार है - 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 यहां अधिकतम 12 है। दृष्टिकोण सरल है। हम वर्टिकल ऑर्डर ट्रैवर्सल करेंगे, फिर योग