কম্পিউটার টিউটোরিয়াল

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


বাইনারি ট্রি দেওয়া থাকলে প্রোগ্রামটি রুট থেকে লিফ পর্যন্ত অনেক পথের মধ্যে সবচেয়ে ছোটো পথটি বের করবে।

যেহেতু আমরা ট্রি বাম থেকে ডান দিকে ট্রাভার্স করি, তাই যদি রুট থেকে লিফ পর্যন্ত একাধিক ছোটো পথ থাকে তবে প্রোগ্রামটি বাম পাশের প্রথম ট্রাভার্স করা ছোটো পথটি প্রিন্ট করবে।

আমরা একটি কিউ ব্যবহার করতে পারি যা লেভেল অর্ডার ট্রাভার্সাল ব্যবহার করে প্রতিটি লেভেল ট্রাভার্স করবে এবং সবচেয়ে কম লেভেল বিশিষ্ট পথটি প্রিন্ট করবে কারণ সেটিই রুট থেকে লিফ পর্যন্ত সবচেয়ে ছোটো পথ।

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

উপরের ট্রিতে, রুট থেকে লিফ পর্যন্ত একাধিক পথ রয়েছে −

10 -> 3 (এটি সবচেয়ে ছোটো পথ) 10 -> 211 -> 100 10 -> 211 -> 146

উদাহরণ

ইনপুট: 10 3 211 100 146 আউটপুট: 10 3

অ্যালগরিদম

Step 1 → create a structure of a node as
   struct node
      struct node *left, *right
      int data
   End
Step 2 → function to create a node
   node* newnode(int data)
   node *temp = new node
   temp->data = data
   temp->left = temp->right= NULL
   return temp
Step 3 → create function for calculating path
   void path(int data, unordered_map <int,int> prnt)
      IF prnt[data] = data
         Return
      End
      path(prnt[data], prnt)
      print prnt[data]
step 4 → function for finding out the left path
   void left(Node* root)
   create STL queue<Node*> que
   que.push(root)
   int leaf = -1
   Node* temp = NULL
   Create STL unordered_map<int, int> prnt
   prnt[root->data] = root->data
   Loop While !que.empty()
      temp = que.front()
      que.pop()
      IF !temp->left && !temp->right
         leaf = temp->data
         break
      End
      Else
         IF temp->left
            que.push(temp->left)
            prnt[temp->left->data] = temp->data
         End
         IF temp->right
            que.push(temp->right)
            prnt[temp->right->data] = temp->data
         End
      End
   End
   path(leaf, prnt)
   print leaf
Step 5 → In main()
   Create tree using Node* root = newnode(90)
   root->left = newnode(21)
   call left(root)
stop

উদাহরণ

#include <bits/stdc++.h> using namespace std; // structure of a node struct Node {    struct Node *left,*right;    int data; }; //function to create a new node Node* newnode(int data){    Node* temp = new Node;    temp->data = data;    temp->left = NULL;    temp->right = NULL;    return temp; } //function to set a path void path(int data, unordered_map <int,int> prnt) {    if (prnt[data] == data)       return;    path(prnt[data], prnt);    cout << prnt[data] << " "; } //function for a leaf path void left(Node* root) {    queue<Node*> que;    que.push(root);    int leaf = -1;    Node* temp = NULL;    unordered_map<int, int> prnt;    prnt[root->data] = root->data;    while (!que.empty()){       temp = que.front();       que.pop();       if (!temp->left && !temp->right{          leaf = temp->data;          break;       } else {          if (temp->left){             que.push(temp->left);             prnt[temp->left->data] = temp->data;          }          if (temp->right){             que.push(temp->right);             prnt[temp->right->data] = temp->data;          }       }    }    path(leaf, prnt);    cout << leaf << " "; } int main(){    Node* root = newnode(90);    root->left = newnode(21);    root->right = newnode(32);    root->left->left = newnode(45);    root->right->left = newnode(52);    root->right->right = newnode(27);    root->left->left->left = newnode(109);    root->left->left->right = newnode(101);    root->right->right->left = newnode(78);    left(root);    return 0; }

আউটপুট

যদি আমরা উপরের প্রোগ্রামটি রান করি তবে এটি নিচের আউটপুট জেনারেট করবে

90 32 52

  1. C++ প্রোগ্রামিং-এ রিকার্শন ছাড়া রুট-টু-লিফ পথ প্রিন্ট করা

  2. C++ প্রোগ্রামিং-এ ট্রির বিষম লেভেলের নোডগুলো প্রিন্ট করা

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

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