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

पता लगाएं कि क्या संतुलित बीएसटी में कोई ट्रिपल है जो सी ++ में शून्य में जोड़ता है


मान लीजिए कि हमारे पास एक संतुलित बाइनरी सर्च ट्री है, हमें is_valid_triplet() नाम का एक फंक्शन बनाना होगा, जो तब सही हो जाता है जब दिए गए BST में एक ट्रिपलेट मौजूद होता है, जिसका योग 0 के बराबर होता है, अन्यथा गलत रिटर्न देता है। . इन बाधाओं का पालन करके विधि डिजाइन करें -

  • अपेक्षित समय जटिलता O(n^2)

    . है
  • O(logn) अतिरिक्त स्थान का उपयोग किया जा सकता है।

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

पता लगाएं कि क्या संतुलित बीएसटी में कोई ट्रिपल है जो सी ++ में शून्य में जोड़ता है

तो आउटपुट ट्रू होगा, क्योंकि ट्रिपलेट [-15,7,8]

. है

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

  • फ़ंक्शन को परिभाषित करें bst_to_douli_list(), यह रूट, हेड, टेल,

    लेगा
  • यदि रूट NULL के समान है, तो -

    • वापसी

  • यदि रूट का बायां भाग शून्य नहीं है, तो -

    • bst_to_douli_list (जड़, सिर, पूंछ के बाईं ओर)

  • जड़ के बाईं ओर :=पूंछ

  • अगर पूंछ शून्य नहीं है, तो -

    • पूंछ का दाहिना भाग :=जड़

  • अन्यथा

    • सिर :=जड़

  • पूंछ :=जड़

  • यदि मूल का दायाँ अशक्त नहीं है, तो -

    • bst_to_douli_list (जड़, सिर, पूंछ के दाईं ओर)

  • फ़ंक्शन को परिभाषित करें is_in_double_list(), इसमें शीर्ष, पूंछ, योग,

    . लगेगा
  • जबकि सिर पूंछ के बराबर नहीं है, करें -

    • करंट:=सिर की कुंजी + पूंछ की कुंजी

    • यदि धारा योग के समान है, तो -

      • सही लौटें

    • अन्यथा जब करंट> योग, तब -

      • पूंछ:=पूंछ के बाईं ओर

    • अन्यथा

      • सिर :=सिर के दायें

  • झूठी वापसी

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

  • यदि रूट शून्य है, तो -

    • झूठी वापसी

  • सिर =शून्य

  • पूंछ =शून्य

  • bst_to_douli_list(जड़, सिर, पूंछ)

  • जबकि (सिर का दाहिना भाग पूंछ के बराबर नहीं है और सिर की कुंजी <0), करते हैं -

    • अगर is_in_double(सिर का दायां, पूंछ, सिर की कुंजी * (-1), तो

      • सही लौटें

    • अन्यथा

      • सिर :=सिर के दायें

  • झूठी वापसी

उदाहरण (C++)

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

#include <bits/stdc++.h>
using namespace std;
class TreeNode {
   public:
   int key;
   TreeNode *left;
   TreeNode *right;
   TreeNode() : key(0), left(NULL), right(NULL) {}
   TreeNode(int x) : key(x), left(NULL), right(NULL) {}
};
void bst_to_doubli_list(TreeNode* root, TreeNode** head, TreeNode** tail) {
   if (root == NULL)
      return;
   if (root->left)
      bst_to_doubli_list(root->left, head, tail);
   root->left = *tail;
   if (*tail)
      (*tail)->right = root;
   else
      *head = root;
      *tail = root;
   if (root->right)
      bst_to_doubli_list(root->right, head, tail);
}
bool is_in_double_list(TreeNode* head, TreeNode* tail, int sum) {
   while (head != tail) {
      int current = head->key + tail->key;
      if (current == sum)
         return true;
      else if (current > sum)
         tail = tail->left;
      else
         head = head->right;
   }
   return false;
}
bool is_valid_triplet(TreeNode *root) {
   if (root == NULL)
      return false;
   TreeNode* head = NULL;
   TreeNode* tail = NULL;
   bst_to_doubli_list(root, &head, &tail);
   while ((head->right != tail) && (head->key < 0)){
      if (is_in_double_list(head->right, tail, -1*head->key))
         return true;
      else
         head = head->right;
   }
   return false;
}
TreeNode* insert(TreeNode* root, int key) {
   if (root == NULL)
      return new TreeNode(key);
   if (root->key > key)
      root->left = insert(root->left, key);
   else
      root->right = insert(root->right, key);
   return root;
}
int main(){
   TreeNode* root = NULL;
   root = insert(root, 7);
   root = insert(root, -15);
   root = insert(root, 15);
   root = insert(root, -7);
   root = insert(root, 14);
   root = insert(root, 16);
   root = insert(root, 8);
   cout << is_valid_triplet(root);
}

इनपुट

root = insert(root, 7);
root = insert(root, -15);
root = insert(root, 15);
root = insert(root, -7);
root = insert(root, 14);
root = insert(root, 16);
root = insert(root, 8);

आउटपुट

1

  1. C++ में संतुलित BST में दिए गए योग के साथ एक युग्म खोजें

    मान लीजिए कि हमारे पास एक संतुलित बाइनरी सर्च ट्री और एक लक्ष्य योग है, हमें एक ऐसी विधि को परिभाषित करना होगा जो यह जांचती है कि यह योग के साथ एक जोड़ी लक्ष्य योग के बराबर है या नहीं। इस मामले में। हमें यह ध्यान रखना होगा कि बाइनरी सर्च ट्री अपरिवर्तनीय है। तो, अगर इनपुट पसंद है तो आउटपुट होगा

  1. सी ++ प्रोग्राम एक ग्राफ के ट्रांजिटिव क्लोजर का पता लगाने के लिए

    यदि एक निर्देशित ग्राफ दिया गया है, तो निर्धारित करें कि दिए गए ग्राफ में सभी शीर्ष जोड़े (i, j) के लिए एक शीर्ष j दूसरे शीर्ष i से पहुंच योग्य है या नहीं। रीचेबल का मतलब है कि शीर्ष i से j तक का रास्ता है। इस रीचैबिलिटी मैट्रिक्स को ग्राफ़ का ट्रांजिटिव क्लोजर कहा जाता है। Warshall एल्गोरिथम आमतौर

  1. सी # का उपयोग करके ज़ीरो को जोड़ने वाले सभी अद्वितीय ट्रिपल कैसे खोजें?

    आसान तरीका यह है कि हम तीन नेस्टेड लूप बना सकते हैं और एक-एक करके जांच सकते हैं कि तीनों तत्वों का योग शून्य है या नहीं। यदि तीन तत्वों का योग शून्य है तो प्रिंट तत्व। समय की जटिलता - हे(n3 ) अंतरिक्ष जटिलता -ओ(1) हम सरणी के प्रत्येक मान को संग्रहीत करने के लिए एक अनियंत्रित सेट डेटा संरचना का उपयोग