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

दो बीएसटी से जोड़े की गणना करें जिनकी राशि सी ++ में दिए गए मान x के बराबर है

हमें इनपुट के रूप में दो बाइनरी सर्च ट्री और एक वेरिएबल x दिया गया है। लक्ष्य प्रत्येक पेड़ से नोड्स के जोड़े को ढूंढना है ताकि नोड्स के मूल्य का योग x के बराबर हो। BST_1 से नोड 1 और BST_2 से नोड 2 लें और दोनों का डेटा भाग जोड़ें। यदि योग =x. वेतन वृद्धि की संख्या।

आइए उदाहरणों से समझते हैं।

इनपुट

दो बीएसटी से जोड़े की गणना करें जिनकी राशि सी ++ में दिए गए मान x के बराबर है

आउटपुट − दो BST से युग्मों की संख्या जिनका योग किसी दिए गए मान x के बराबर है − 1

. है

स्पष्टीकरण - जोड़ी है (8,6)

इनपुट

दो बीएसटी से जोड़े की गणना करें जिनकी राशि सी ++ में दिए गए मान x के बराबर है

आउटपुट −दो बीएसटी से युग्मों की संख्या जिनका योग किसी दिए गए मान x के बराबर है − 2

. है

स्पष्टीकरण - जोड़े हैं (5,15) और (4,16)

नीचे दिए गए प्रोग्राम में इस्तेमाल किया गया तरीका इस प्रकार है

इस दृष्टिकोण में हम एक पुनरावृत्त इनऑर्डर विधि का उपयोग करके बीएसटी को पार करेंगे। सबसे छोटे नोड से सबसे बड़े बीएसटी 1 को पुनरावृत्त इनऑर्डर विधि का उपयोग करके और बीएसटी 2 को पुनरावृत्त इनऑर्डर विधि के विपरीत से पार करें। दोनों BST के वर्तमान नोड्स का योग लें। यदि योग x वृद्धि गणना है। यदि sum>x तो BST 2 में वर्तमान नोड के इनऑर्डर पूर्ववर्ती पर जाएँ। यदि sum

  • दो पेड़ BST_1 और BST_2 लें जिनमें पूर्णांक डेटा भाग हो और बाएँ, दाएँ पॉइंटर्स चाइल्ड नोड्स की ओर हों।

  • फ़ंक्शन इन्सर्ट_नोड (इंट डेटा) डेटा के साथ ट्री में एक नया नोड सम्मिलित करता है और इसके लिए एक पॉइंटर लौटाता है।

  • inser_node() का उपयोग करके दोनों BST बनाएं और BST_sum_x(Tree* BST_1, Tree* BST_2, int x) को पास करें।

  • फ़ंक्शन BST_sum_x(Tree* BST_1, Tree* BST_2, int x) दोनों पेड़ों के रूट नोड्स लेता है और डेटा भाग के योग के साथ नोड्स के जोड़े की संख्या x के रूप में देता है।

  • योग x के साथ जोड़े की संख्या के लिए प्रारंभिक गणना 0 के रूप में लें।

  • पुनरावृत्त इनऑर्डर ट्रैवर्सल के लिए दो चर ट्री* स्टैक_टॉप_1, *स्टैक_टॉप_2;

    लें
  • दो स्टैक स्टैक बनाएं स्टैक_1, स्टैक_2;

  • अब लूप के दौरान बाहरी शुरू करें।

  • जबकि लूप का उपयोग करके BST_1 के सबसे बाएं (सबसे छोटे) नोड पर जाएं और सभी नोड्स को स्टैक_1 पर पुश करें_1

  • लूप के दौरान BST_2 के सबसे दाहिने (सबसे बड़े) नोड पर जाएं और सभी नोड्स को स्टैक_2 पर पुश करें

  • यदि कोई स्टैक खाली है तो लूप के दौरान बाहरी को तोड़ दें।

  • दोनों स्टैक के शीर्ष नोड्स लें और उनके डेटा भागों को जोड़ें और अस्थायी रूप से स्टोर करें।

  • अगर अस्थायी (योग) ==x तो वेतन वृद्धि गिनती। पॉप ऑपरेशन का उपयोग करके स्टैक_1 और स्टैक_2 दोनों से शीर्ष तत्वों को निकालें।

  • BST_1=stack_1->दाएं और BST_2=stack_2->बाएं (BST_1 में अगला उत्तराधिकारी और BST_2 में पूर्ववर्ती)

    सेट करें
  • यदि temp

  • IF temp> x तो केवल स्टैक_2 से ऊपर निकालें और BST_1 में अगले पूर्ववर्ती पर जाएं।

  • बाहरी समय के अंत में, गिनती में कई जोड़े होते हैं जिनमें दोनों बीएसटी के नोड का योग x होता है।

  • परिणाम के रूप में वापसी की गिनती।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
struct Tree{
   int data;
   Tree* left, *right;
};
Tree* insert_node(int data){
   Tree* newNode = (Tree*)malloc(sizeof(Tree));
   newNode->data = data;
   newNode->left = NULL;
   newNode->right = NULL;
}
int BST_sum_x(Tree* BST_1, Tree* BST_2, int x){
   int count = 0;
   Tree* stack_top_1, *stack_top_2;
   stack<Tree*> stack_1, stack_2;
   if (BST_1 == NULL || BST_2 == NULL){
      return 0;
   }
   while (1){
      while (BST_1 != NULL){
         stack_1.push(BST_1);
         BST_1 = BST_1->left;
      }
      while (BST_2 != NULL){
         stack_2.push(BST_2);
         BST_2 = BST_2->right;
      }
      if (stack_1.empty() || stack_2.empty()){
         break;
      }
      stack_top_1 = stack_1.top();
      stack_top_2 = stack_2.top();
      int temp = stack_top_1->data + stack_top_2->data;
      if (temp == x){
         count++;
         stack_1.pop();
         stack_2.pop();
         BST_1 = stack_top_1->right;
         BST_2 = stack_top_2->left;
      }
      else if (temp < x){
         stack_1.pop();
         BST_1 = stack_top_1->right;
      }
      else{
         stack_2.pop();
         BST_2 = stack_top_2->left;
      }
   }
   return count;
}
int main(){
   //BST 1
   Tree* BST_1 = insert_node(15);
   BST_1->left = insert_node(10);
   BST_1->right = insert_node(8);
   BST_1->left->left = insert_node(12);
   BST_1->left->right = insert_node(24);
   BST_1->right->left = insert_node(16);
   //BST 2
   Tree* BST_2 = insert_node(20);
   BST_2->left = insert_node(16);
   BST_2->right = insert_node(4);
   BST_2->left->left = insert_node(18);
   BST_2->left->right = insert_node(28);
   BST_2->right->left = insert_node(22);
   int x = 28;
   cout<<"Count of pairs from two BSTs whose sum is equal to a given value x ar: "<<BST_sum_x(BST_1, BST_2, x);
   return 0;
}

आउटपुट

यदि हम उपरोक्त कोड चलाते हैं तो यह निम्न आउटपुट उत्पन्न करेगा -

Count of pairs from two BSTs whose sum is equal to a given value x ar: 1

  1. C++ में दिए गए मान x तक योग करने वाले उपप्रकारों की गणना करें

    इनपुट के रूप में एक बाइनरी ट्री और एक मान x दिया गया है। लक्ष्य एक बाइनरी ट्री के सभी उपप्रकारों को खोजना है जिनके नोड्स के भार का योग x के बराबर है। उदाहरण के लिए इनपुट x =14. मान डालने के बाद जो ट्री बनाया जाएगा वह नीचे दिया गया है आउटपुट Count of subtrees that sum up to a given value x are:

  1. एक क्रमबद्ध दोगुनी लिंक की गई सूची में ट्रिपल की गणना करें जिसका योग C++ में दिए गए मान x के बराबर है

    उदाहरण के लिए इनपुट linked list: [ 3−4−13−5−10−10−0 ] x=20 आउटपुट Count of triplets in a sorted doubly linked list whose product is equal to a given value x are: 2 स्पष्टीकरण Triplets will be: ( 3,4,13 ) and ( 10,10,0 ) इनपुट linked list: [ 4−3−1&minu

  1. एक क्रमबद्ध डबल लिंक्ड सूची में ट्रिपल गिनें जिसका उत्पाद सी ++ में दिए गए मान x के बराबर है

    पूर्णांक मानों वाली एक क्रमबद्ध डबल लिंक्ड सूची को देखते हुए। लक्ष्य उन त्रिगुणों को खोजना है जिनका गुणनफल दिए गए मान x के बराबर है। यदि इनपुट लिंक्ड सूची 3−4−1−2 है और x 6 है तो गिनती 1 (ट्रिपलेट (3,1,2)) होगी उदाहरण के लिए इनपुट linked list: [ 200−4−16−5−10−10&min