প্রি-অর্ডার, ইন-অর্ডার এবং পোস্ট-অর্ডার ট্র্যাভারসাল কৌশল কখন ব্যবহার করবেন
কোন পরিস্থিতিতে বাইনারি গাছের জন্য প্রাক-অর্ডার, ইন-অর্ডার এবং পোস্ট-অর্ডার কী পরিস্থিতিতে ব্যবহার করতে হবে তা বোঝার আগে আপনাকে প্রতিটি ট্র্যাভারসাল কৌশল কীভাবে কাজ করে তা ঠিক বুঝতে হবে। উদাহরণস্বরূপ নিম্নলিখিত গাছটি ব্যবহার করুন।
গাছের মূল 7 , বাম সর্বাধিক নোড 0 , ডান সর্বাধিক নোড 10 ।
প্রাক-অর্ডার ট্র্যাভারসাল :
সংক্ষিপ্তসার: মূলটিতে শুরু হয় ( 7 ), ডান-সর্বাধিক নোড ( 10 ) এ শেষ হয়
ট্র্যাভার্সাল ক্রম: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
অর্ডার ট্র্যাভারসাল :
সংক্ষিপ্তসার: বাম-সর্বাধিক নোড ( 0 ) এ শুরু হয়, ডানদিকের নোডে শেষ হবে ( 10 )
ট্র্যাভার্সাল সিকোয়েন্স: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
পোস্ট-অর্ডার ট্র্যাভারসাল :
সংক্ষিপ্তসার: বাম-সর্বাধিক নোড ( 0 ) দিয়ে শুরু হয়, মূল দিয়ে শেষ হয় ( 7 )
ট্র্যাভার্সাল ক্রম: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
প্রি-অর্ডার, অর্ডার বা পোস্ট-অর্ডার কখন ব্যবহার করবেন?
প্রোগ্রামারটি যে ট্র্যাভারসাল কৌশলটি নির্বাচন করে তা ডিজাইন করা অ্যালগরিদমের নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে। লক্ষ্যটি গতি, সুতরাং কৌশলটি চয়ন করুন যা আপনাকে দ্রুত প্রয়োজন এমন নোডগুলি নিয়ে আসে।
যদি আপনি জানেন যে কোনও পাতা পরিদর্শন করার আগে আপনার শিকড়গুলি অন্বেষণ করা দরকার, আপনি প্রাক-অর্ডার বেছে নিন কারণ আপনি সমস্ত পাতার আগে সমস্ত শিকড়ের মুখোমুখি হবেন।
যদি আপনি জানেন যে কোনও নোডের আগে আপনাকে সমস্ত পাতা সন্ধান করতে হবে, আপনি পোস্ট-অর্ডার নির্বাচন করুন কারণ আপনি পাতার অনুসন্ধানে শিকড়গুলি পরিদর্শন করতে কোনও সময় নষ্ট করবেন না।
যদি আপনি জানেন যে গাছের নোডগুলিতে একটি অন্তর্নিহিত ক্রম রয়েছে এবং কোনও অর্ডারে ট্র্যাভারসাল ব্যবহার করা না থেকে আপনি গাছটিকে তার মূল অনুক্রমের দিকে ফিরে সমতল করতে চান । গাছটি তৈরি করা হয়েছিল ঠিক একইভাবে চ্যাপ্টা হবে। প্রাক-অর্ডার বা পোস্ট-অর্ডার ট্র্যাভারসাল গাছটিকে এটি তৈরির জন্য ব্যবহৃত ক্রম অনুসারে পুনরায় উন্মুক্ত করতে পারে না।
প্রি-অর্ডার, ইন-অর্ডার এবং পোস্ট-অর্ডার (সি ++) এর জন্য রিকারসিভ অ্যালগোরিদম:
struct Node{
int data;
Node *left, *right;
};
void preOrderPrint(Node *root)
{
print(root->name); //record root
if (root->left != NULL) preOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) preOrderPrint(root->right);//traverse right if exists
}
void inOrderPrint(Node *root)
{
if (root.left != NULL) inOrderPrint(root->left); //traverse left if exists
print(root->name); //record root
if (root.right != NULL) inOrderPrint(root->right); //traverse right if exists
}
void postOrderPrint(Node *root)
{
if (root->left != NULL) postOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) postOrderPrint(root->right);//traverse right if exists
print(root->name); //record root
}