একটি বাইনারি ট্রি দেওয়া আছে। কাজ হলো লিফ নোডগুলো পেয়ারওয়াইজ (pairwise) সওয়াপ (swap) করা। উদাহরণ −
ইনপুট −

আউটপুট −

দেওয়া সমস্যায়, আমরা দুটি পয়েন্টার রাখব যা দুটি סমвига লিফ নোডকে পয়েন্ট করবে এবং তাদের মান সওয়াপ করব।
এই পদ্ধতিতে, আমরা ট্রি ট্রাভার্স করব, লিফ নোড খুঁজব, এবং একটি কাউন্টার (counter) দিয়ে করেন্ট কাউন্ট ট্র্যাক করব। মূল ট্রিক হলো: কাউন্টার বিজোড় (odd) হলে প্রথম পয়েন্টার (firstleaf) ওই নোডকে পয়েন্ট করবে। যখন কাউন্টার জোড় (even) হবে, তখন ডেটা সওয়াপ করব। এভাবেই লিফ নোডগুলো সওয়াপ হবে।
উপরোক্ত পদ্ধতির C++ কোড
#include <bits/stdc++.h> using namespace std; struct Node{ // ট্রি নোড স্ট্রাকচার int data; struct Node *left, *right; }; void Swap(Node **a, Node **b){ // সওয়াপ ইউটিলিটি Node *temp = *a; *a = *b; *b = temp; } /********লিফ নোড সওয়াপের জন্য পয়েন্টার********/ Node **firstleaf; Node **secondleaf; void SwapTheLeafNodes(Node **root, int &count){ // রিকার্সিভ ফাংশন if (!(*root)) return; // রুট NULL হলে রিটার্ন if(!(*root)->left && !(*root)->right){ // লিফ নোড কন্ডিশন secondleaf = root; // সেকেন্ড পয়েন্টার এই নোডকে পয়েন্ট করে count++; // কাউন্ট বাড়ানো if (count % 2 == 0) // কাউন্ট জোড় হলে জোড়া পেলে সওয়াপ Swap(firstleaf, secondleaf); else // কাউন্ট বিজোড় হলে প্রথম নোড সংরক্ষণ firstleaf = secondleaf; } if ((*root)->left) SwapTheLeafNodes(&(*root)->left, count); if ((*root)->right) SwapTheLeafNodes(&(*root)->right, count); } Node* newNode(int data){ // নতুন নোড ইনিশিয়ালাইজ Node *temp = new Node; temp->data = data; temp->left = temp->right = NULL; return temp; } void printInorder(Node* node){ // ইনঅর্ডার ট্রাভার্সাল if (node == NULL) return; printInorder(node->left); printf("%d ", node->data); printInorder(node->right); } int main(){ /* বাইনারি ট্রি তৈরি */ Node *root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->right->left = newNode(5); root->right->right = newNode(8); root->right->left->left = newNode(6); root->right->left->right = newNode(7); root->right->right->left = newNode(9); root->right->right->right = newNode(10); cout << "Inorder traversal before swap:\n"; printInorder(root); cout << "\n"; int count = 0; // লিফ নোড ট্র্যাক করার কাউন্টার SwapTheLeafNodes(&root, count); // নোড সওয়াপ cout << "Inorder traversal after swap:\n"; printInorder(root); cout << "\n"; return 0; }
Inorder traversal before swap: 4 2 1 6 5 7 3 9 8 10 Inorder traversal after swap: 6 2 1 4 5 9 3 7 8 10
উপরের পদ্ধতিতে, আমরা দুটি পয়েন্টার তৈরি করেছি যা লিফ নোডগুলো ট্র্যাক করবে। ট্রি ট্রাভার্সালের সময় লিফ নোড পাওয়া গেলে, প্রথমে সেকেন্ড পয়েন্টারকে সেটি পয়েন্ট করিয়ে কাউন্ট বাড়াই। কাউন্ট জোড় হলে দুটি পয়েন্টারের নোড সওয়াপ করি, বিজোড় হলে ফার্স্ট পয়েন্টারে সেটি সংরক্ষণ করি। এভাবেই ফাংশনটি কাজ করে।
এই টিউটোরিয়ালে আমরা বাইনারি ট্রিতে পেয়ারওয়াইজ লিফ নোড সওয়াপ করার সমস্যা সমাধান করেছি। আমরা এই সমস্যার C++ প্রোগ্রাম ও সম্পূর্ণ পদ্ধতি (সহজ ও দক্ষ) দেখেছি। একই প্রোগ্রাম C, Java, Python ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।