प्री-ऑर्डर, इन-ऑर्डर और पोस्ट-ऑर्डर ट्रैवर्सल रणनीति का उपयोग कब करें
इससे पहले कि आप समझ सकें कि बाइनरी ट्री के लिए प्री-ऑर्डर, इन-ऑर्डर और पोस्ट-ऑर्डर का उपयोग करने के लिए किन परिस्थितियों में, आपको यह समझना होगा कि प्रत्येक ट्रावेलर रणनीति कैसे काम करती है। एक उदाहरण के रूप में निम्नलिखित पेड़ का उपयोग करें।
पेड़ की जड़ 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
प्री-ऑर्डर, इन-ऑर्डर या पोस्ट-ऑर्डर का उपयोग कब करें?
ट्रावेलर रणनीति प्रोग्रामर का चयन करती है जो एल्गोरिथ्म की विशिष्ट जरूरतों पर निर्भर करती है। लक्ष्य गति है, इसलिए उस रणनीति को चुनें जो आपको सबसे तेज आवश्यकता वाले नोड्स लाती है।
यदि आप जानते हैं कि आपको किसी भी पत्ते का निरीक्षण करने से पहले जड़ों का पता लगाने की आवश्यकता है, तो आप पूर्व-आदेश चुनें क्योंकि आप सभी पत्तियों से पहले सभी जड़ों का सामना करेंगे।
यदि आप जानते हैं कि आपको किसी भी नोड्स से पहले सभी पत्तियों का पता लगाने की आवश्यकता है, तो आप पोस्ट-ऑर्डर का चयन करते हैं क्योंकि आप पत्तियों की खोज में जड़ों का निरीक्षण करने में कोई समय बर्बाद नहीं करते हैं।
यदि आप जानते हैं कि पेड़ की नोड्स में एक अंतर्निहित अनुक्रम है, और आप पेड़ को अपने मूल अनुक्रम में समतल करना चाहते हैं, तो इन-ऑर्डर ट्रैवर्सल का उपयोग किया जाना चाहिए। जिस तरह से इसे बनाया गया था उसी तरह से पेड़ को चपटा किया जाएगा। एक पूर्व-आदेश या पोस्ट-ऑर्डर ट्रैवर्सल पेड़ को उस क्रम में वापस नहीं खोल सकता है, जिसे इसे बनाने के लिए इस्तेमाल किया गया था।
प्री-ऑर्डर, इन-ऑर्डर और पोस्ट-ऑर्डर (C ++) के लिए पुनरावर्ती एल्गोरिदम:
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
}