কম্পিউটার

C++ প্রোগ্রামিং-এ বাইনারি ট্রিতে যেকোনো দুটি নোডের মধ্যে প্রিন্ট পাথ।


আমাদেরকে স্বতন্ত্র নোডের একটি বাইনারি ট্রি এবং বাইনারি গাছের দুটি নোড দেওয়া হয়েছে যার পাথ বাইনারি ট্রিতে আমরা প্রিন্ট করতে চাই৷

C++ প্রোগ্রামিং-এ বাইনারি ট্রিতে যেকোনো দুটি নোডের মধ্যে প্রিন্ট পাথ।

উদাহরণস্বরূপ − আমরা নোড 140 থেকে 211 এর মধ্যে পাথ প্রিন্ট করতে চাই তাই এর আউটপুট −

এর মত হওয়া উচিত।
Output: 140->3->10->211

ধারণাটি হল দুটি নোডের রুট নোড গঠনের পাথগুলি খুঁজে বের করা এবং সেগুলিকে দুটি পৃথক ভেক্টর বা অ্যারে বলে path1 এবং path2 বলে৷

এখন, দুটি ভিন্ন কেস দেখা দেয় -

  • যদি দুটি নোড রুট নোডের বিভিন্ন সাবট্রিতে থাকে − যখন দুটি নোড বিভিন্ন সাবট্রিতে থাকে যেমন একটি বামে এবং অন্যটি ডানদিকে। এই ক্ষেত্রে, এটা স্পষ্ট যে রুট নোডটি নোড 1 থেকে নোড 2 পর্যন্ত পথের মধ্যে থাকবে। সুতরাং, বিপরীত ক্রমে path1 এবং তারপর path2 প্রিন্ট করুন।
  • যদি নোডগুলি একই সাবট্রিতে থাকে − যখন উভয় নোড একই সাবট্রিতে থাকে যা হয় বাম সাবট্রিতে বা ডান সাবট্রিতে হতে পারে। এই ক্ষেত্রে, আপনাকে রুট থেকে দুটি নোডের পথটি পর্যবেক্ষণ করতে হবে একটি ছেদ বিন্দু থাকবে যার আগে রুট নোড থেকে দুটি নোডের জন্য পথটি সাধারণ। আমাদের ছেদ বিন্দু খুঁজে বের করতে হবে এবং উপরের ক্ষেত্রের মতো সেই বিন্দু থেকে নোডগুলি প্রিন্ট করতে হবে।

অ্যালগরিদম

START
STEP 1-> DEFINE A struct Node
   WITH int data AND Node *left, *right;
STEP 2-> DEFINE A TREE STRUCTURE struct Node* tree(int data)FUNCTION bool path(Node* root, vector& arr, int x)
STEP 1-> IF root IS NULL
   RETURN false
   END IF
STEP 2-> arr.push_back(root->data)
   IF root->data == x THEN
      RETURN true
   END IF
STEP 3-> IF path(root->left, arr, x) || path(root->right, arr, x) THEN,
   RETURN true
STEP 4-> arr.pop_back()
   return false
END FUNCTION
FUNCTION void printPath(Node* root, int n1, int n2)
STEP 1-> DEFINE A vector<int> path1
STEP 2-> DEFINE A vector<int> path2
STEP 3-> CALL FUNCTION path(root, path1, n1)
STEP 4-> CALL FUNCTION path(root, path2, n2)
STEP 5-> DEFINE AND SET intersection = -1, i = 0, j = 0
STEP 6-> LOOP WHILE i != path1.size() || j != path2.size()
   IF i == j && path1[i] == path2[j]
      INCREMENT i BY 1
      INCREMENT j BY 1
   ELSE
      SET intersection = j - 1
      BREAK;
   END IF
END WHILE
STEP 7-> LOOP FOR i = path1.size() – 1 AND i > intersection AND i--PRINT path1[i]
   END FOR
STEP 8-> LOOP FOR i = intersection AND i < path2.size() AND i++
   PRINT path2[i]
END FOR

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
// structure of a node of binary tree
struct Node {
   int data;
   Node *left, *right;
};
struct Node* tree(int data){
   struct Node* newNode = new Node;
   newNode->data = data;
   newNode->left = newNode->right = NULL;
   return newNode;
}
bool path(Node* root, vector<int>& arr, int x){
   if (!root)
      return false;
   // push the node's value in 'arr'
   arr.push_back(root->data);
   // if it is the required node
   // return true
   if (root->data == x)
      return true;
   if (path(root->left, arr, x) || path(root->right, arr, x))
      return true;
   arr.pop_back();
   return false;
}
// Function to print the path between
// any two nodes in a binary tree
void printPath(Node* root, int n1, int n2){
   // vector to store the path
   vector<int> path1;
   vector<int> path2;
   path(root, path1, n1);
   path(root, path2, n2);
   int intersection = -1;
   int i = 0, j = 0;
   while (i != path1.size() || j != path2.size()) {
      if (i == j && path1[i] == path2[j]) {
         i++;
         j++;
      } else {
         intersection = j - 1;
         break;
      }
   }
   // Print the required path
   for (int i = path1.size() - 1; i > intersection; i--)
      cout << path1[i] << " ";
   for (int i = intersection; i < path2.size(); i++)
      cout << path2[i] << " ";
}
int main(){
   // binary tree formation
   struct Node* root = tree(1);
   root->left = tree(2);
   root->left->left = tree(4);
   root->left->left->left = tree(6);
   root->left->right = tree(5);
   root->left->right->left = tree(7);
   root->left->right->right = tree(8);
   root->right = tree(3);
   root->right->left = tree(9);
   root->right->right = tree(10);
   int node1 = 5;
   int node2 = 9;
   printPath(root, node1, node2);
   return 0;
}

আউটপুট

এই প্রোগ্রামটি আউটপুট −

প্রিন্ট করবে
5 2 1 3 9

  1. বাইনারি গাছের নোডগুলি প্রিন্ট করুন যেহেতু তারা C++ প্রোগ্রামিং-এ লিফ নোড হয়ে যায়।

  2. C++ প্রোগ্রামিং-এ বাইনারি ট্রি-তে প্রথম সংক্ষিপ্ত রুট টু লিফ পাথ প্রিন্ট করুন।

  3. C++ প্রোগ্রামিং-এ একটি গাছের বিজোড় স্তরে নোডগুলি প্রিন্ট করুন।

  4. C++ প্রোগ্রামিং-এ একটি বাইনারি ট্রিতে সমস্ত নোডের লেভেল প্রিন্ট করুন।