কম্পিউটার

C++ এ বাইনারি ট্রির তির্যক ট্রাভার্সাল?


ঢাল -1 লাইনের মধ্যবর্তী নোডগুলি বিবেচনা করা। বাইনারি ট্রির তির্যক ট্রাভার্সাল হবে এই লাইনগুলির মধ্যে উপস্থিত সমস্ত নোডগুলিকে অতিক্রম করা এবং মুদ্রণ করা৷

আসুন প্রথমে স্ট্রাকটটি সংজ্ঞায়িত করি যা একটি ট্রি নোডকে প্রতিনিধিত্ব করবে যেখানে ডেটা এবং এর বাম এবং ডান নোড চাইল্ড রয়েছে। যদি এটি তৈরি করা প্রথম নোড হয় তবে এটি একটি রুট নোড অন্যথায় একটি চাইল্ড নোড।

struct Node {
   int data;
   struct Node *leftChild, *rightChild;
};

এরপর আমরা আমাদের createNode(int data) ফাংশন তৈরি করি যা একটি int মান নেয় এবং নোডের ডাটা সদস্যকে বরাদ্দ করি। ফাংশন তৈরি করা স্ট্রাকট নোডে পয়েন্টার ফিরিয়ে দেয়। এছাড়াও, নতুন তৈরি নোডের বাম এবং ডান চাইল্ড নাল সেট করা হয়েছে৷

struct Node* newNode(int data){
   struct Node* node = new Node();
   node->data = data;
   node->leftChild = node->rightChild = NULL;
   return node;
}

traverseDiagonal(Node* root, int depth, map> &myMap) ফাংশনটি আমাদের রুট নোড, বর্তমান গভীরতা এবং একটি মানচিত্র নেয় যাতে int-এর মান কী এবং int-এর ভেক্টর মান হিসাবে থাকে। আমরা এই ফাংশনের রেফারেন্স হিসাবে myMap পাস করি। ফাংশনটি তারপর রুটটি নাল কিনা তা পরীক্ষা করে এবং যদি তা না হয় তাহলে আমরা উপাদান রুট->ডাটাকে আমাদের ভেক্টর ডেটা স্ট্রাকচারের পিছনে বর্তমান গভীরতায় পুশ করি যখন আমরা ইনঅর্ডার ট্রাভার্সাল করি।

void traverseDiagonal(Node* root, int depth, map<int, vector<int>> &m){
   if(root){
      m[depth].push_back(root->data);

তারপরে আমরা তির্যক দূরত্ব ট্র্যাক করে গাছের একটি পুনরাবৃত্ত ইনঅর্ডার ট্রাভার্সাল করি এবং যখনই আমরা গাছের বাম শিশুটি অতিক্রম করি তখন গভীরতায় 1 যোগ করি। যখন আমরা গাছের সঠিক বাচ্চাটি অতিক্রম করি তখন আমরা গভীরতার সাথে কিছু যোগ করি না।

traverseDiagonal(root->leftChild, depth+1, myMap);
traverseDiagonal(root->rightChild, depth, myMap);

এর পরে, আমাদের প্রধান ফাংশনে আমরা createNode(data) ফাংশন ব্যবহার করে ট্রি তৈরি করি।

Node *root = createNode(10);
   root->leftChild = createNode(5);
   root->rightChild = createNode(15);
   root->leftChild->leftChild = createNode(4);
   root->leftChild->rightChild = createNode(6);
   root->rightChild->rightChild = createNode(17);
   root->rightChild->rightChild->leftChild = createNode(16);

তারপরে আমরা একটি মানচিত্র myMap ঘোষণা করি যার মধ্যে int কী হিসাবে এবং মান হিসাবে int-এর ভেক্টর রয়েছে। এই মানচিত্রটি তারপরে রুট নোড এবং বর্তমান গভীরতার সাথে ট্রাভার্সডায়াগন্যালে পাস করা হয়।

map<int, vector<int>> myMap;
traverseDiagonal(root, 0, myMap);

মানচিত্র myMap মান দিয়ে পূর্ণ হওয়ার পরে আমরা লুপের জন্য পরিসীমা ব্যবহার করে এটির উপর পুনরাবৃত্তি করি এবং সেই তির্যক মানগুলি মুদ্রণ করি৷

for(auto k: myMap){
   for(auto Nodes: k.second)
      cout<<Nodes<<" ";
      cout<<endl;
}

উদাহরণ

বাইনারি ট্রির তির্যক ট্রাভার্সাল খুঁজে পেতে আমরা নিম্নলিখিত বাস্তবায়ন দেখি।

#include <iostream>
#include <map>
#include <vector>
using namespace std;
struct Node{
   int data;
   Node *leftChild, *rightChild;
};
Node* createNode(int data){
   Node* node = new Node();
   node->data = data;
   node->leftChild = node->rightChild = NULL;
   return node;
}
void traverseDiagonal(Node* root, int depth, map<int, vector<int>> &myMap){
   if(root){
      m[depth].push_back(root->data);
      traverseDiagonal(root->leftChild, depth+1, myMap);
      traverseDiagonal(root->rightChild, depth, myMap);
   }
}
int main(){
   Node *root = createNode(10);
   root->leftChild = createNode(5);
   root->rightChild = createNode(15);
   root->leftChild->leftChild = createNode(4);
   root->leftChild->rightChild = createNode(6);
   root->rightChild->rightChild = createNode(17);
   root->rightChild->rightChild->leftChild = createNode(16);
   map<int, vector<int>> myMap;
   traverseDiagonal(root, 0, myMap);
   for(auto k: myMap){
      for(auto Nodes: k.second)
         cout<<Nodes<<" ";
      cout<<endl;
   }
}

আউটপুট

উপরের কোডটি নিম্নলিখিত আউটপুট −

তৈরি করবে
10 15 17
5 6 16
4

  1. C++ এ সাজানো ক্রমে বাইনারি ট্রি লেভেল প্রিন্ট করুন

  2. C++ এ একটি বাইনারি ট্রির উল্লম্ব ক্রমে ট্রাভার্সালে kth নোড খুঁজুন

  3. C++ এ বাইনারি ট্রিতে সর্বোচ্চ উল্লম্ব যোগফল খুঁজুন

  4. C++ এ একটি বাইনারি গাছের ঘড়ির কাঁটার বিপরীত সর্পিল ট্রাভার্সাল?