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

C++ में एक बाइनरी ट्री की दो पत्तियों के बीच न्यूनतम योग पथ

समस्या कथन

एक बाइनरी ट्री को देखते हुए जिसमें प्रत्येक नोड तत्व में एक संख्या होती है। कार्य एक पत्ती के नोड से दूसरे में न्यूनतम संभव योग खोजना है।

उदाहरण

C++ में एक बाइनरी ट्री की दो पत्तियों के बीच न्यूनतम योग पथ

ऊपर के पेड़ में न्यूनतम उप पथ -6 इस प्रकार है:(-4) + 3 + 2 + (-8) + 1

एल्गोरिदम

विचार रिकर्सिव कॉल में दो मान बनाए रखना है -

  • वर्तमान नोड के अंतर्गत रूट किए गए सबट्री के लिए न्यूनतम रूट टू लीफ पथ योग
  • पत्तियों के बीच न्यूनतम पथ योग
  • प्रत्येक विज़िट किए गए नोड X के लिए, हमें X के बाएँ और दाएँ उप-वृक्षों में न्यूनतम रूट टू लीफ योग खोजना होगा। फिर X के डेटा के साथ दो मान जोड़ें, और वर्तमान न्यूनतम पथ योग के साथ योग की तुलना करें

उदाहरण

#include <bits/stdc++.h>
using namespace std;
typedef struct node {
   int data;
   struct node *left;
   struct node *right;
} node;
node *newNode(int data) {
   node *n = new node;
   n->data = data;
   n->left = NULL;
   n->right = NULL;
   return n;
}
int getMinPath(node *root, int &result) {
   if (root == NULL) {
      return 0;
   }
   if (root->left == NULL && root->right == NULL) {
      return root->data;
   }
   int leftSum = getMinPath(root->left, result);
   int rightSum = getMinPath(root->right, result);
   if (root->left && root->right) {
      result = min(result, root->data + leftSum + rightSum);
      return min(root->data + leftSum, root->data + rightSum);
   }
   if (root->left == NULL) {
      return root->data + rightSum;
   } else {
      return root->data + leftSum;
   }
}
int getMinPath(node *root) {
   int result = INT_MAX;
   getMinPath(root, result);
   return result;
}
node *createTree() {
   node *root = newNode(2);
   root->left = newNode(3);
   root->right = newNode(-8);
   root->left->left = newNode(5);
   root->left->right = newNode(-4);
   root->right->left = newNode(1);
   root->right->right = newNode(10);
   return root;
}
int main() {
   node *root = createTree();
   cout << "Minimum sum path = " << getMinPath(root) << endl;
   return 0;
}

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -

आउटपुट

Minimum sum path = -6

  1. C++ में एक बाइनरी ट्री के दो नोड्स के बीच की दूरी का पता लगाएं

    मान लें कि हमारे पास कुछ नोड्स के साथ एक बाइनरी ट्री है। हमें दो नोड्स u और v के बीच की दूरी ज्ञात करनी है। मान लीजिए कि पेड़ नीचे जैसा है - अब (4, 6) =4 के बीच की दूरी, पथ की लंबाई 4 है, (5, 8) के बीच की लंबाई =5 आदि। इस समस्या को हल करने के लिए, हम एलसीए (सबसे कम सामान्य पूर्वज) ढूंढेंगे, फिर

  1. C++ में दो बाइनरी ट्री में पहले गैर मेल खाने वाले पत्ते खोजें

    मान लीजिए कि हमारे पास दो बाइनरी ट्री हैं। हमें दो पेड़ों का पहला पत्ता ढूंढना है, जो मेल नहीं खाता। यदि मेल न खाने वाले पत्ते नहीं हैं, तो कुछ भी प्रदर्शित न करें। अगर ये दो पेड़ हैं, तो पहले गैर-मिलान पत्ते 11 और 15 हैं। यहां हम स्टैक का उपयोग करके एक साथ दोनों पेड़ों के पुनरावृत्त प्रीऑर्डर ट

  1. C++ प्रोग्रामिंग में बाइनरी ट्री में किन्हीं दो नोड्स के बीच प्रिंट पथ।

    हमें अलग-अलग नोड्स के एक बाइनरी ट्री और बाइनरी ट्री के दो नोड्स दिए गए हैं, जिसका बाइनरी ट्री में पथ हम प्रिंट करना चाहते हैं। उदाहरण के लिए - हम नोड 140 से 211 के बीच के पाथ को प्रिंट करना चाहते हैं, इसलिए इसका आउटपुट इस तरह होना चाहिए - Output: 140->3->10->211 विचार दो नोड्स के लिए रू