प्रीऑर्डर, पोस्टऑर्डर और इनवर्टर बाइनरी सर्च ट्री ट्रैवर्सल रणनीतियों का उपयोग कब करें


97

मुझे हाल ही में एहसास हुआ कि अपने जीवन में BST का भरपूर उपयोग करते हुए, मैंने कभी भी कुछ भी इस्तेमाल करने पर विचार नहीं किया है, लेकिन इनवर्टर ट्रैवर्सल (जबकि मुझे पता है और पूर्व / पोस्ट-ऑर्डर ट्रैवर्सल का उपयोग करने के लिए प्रोग्राम को अनुकूलित करना कितना आसान है)।

इसे साकार करने पर, मैंने अपनी कुछ पुरानी डेटा-संरचनाओं की पाठ्यपुस्तकों को निकाला और प्री-ऑर्डर और पोस्ट-ऑर्डर ट्रैवर्सल्स की उपयोगिता के पीछे तर्क की तलाश की - वे हालांकि बहुत कुछ नहीं कहते थे।

प्रीऑर्डर / पोस्टऑर्डर को व्यावहारिक रूप से उपयोग करने के कुछ उदाहरण क्या हैं? यह आदेश की तुलना में अधिक समझ में कब आता है?

जवाबों:


135

प्री-ऑर्डर, इन-ऑर्डर और पोस्ट-ऑर्डर ट्रैवर्सल रणनीति का उपयोग कब करें

इससे पहले कि आप समझ सकें कि बाइनरी ट्री के लिए प्री-ऑर्डर, इन-ऑर्डर और पोस्ट-ऑर्डर का उपयोग करने के लिए किन परिस्थितियों में, आपको यह समझना होगा कि प्रत्येक ट्रावेलर रणनीति कैसे काम करती है। एक उदाहरण के रूप में निम्नलिखित पेड़ का उपयोग करें।

पेड़ की जड़ 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

प्री-ऑर्डर, इन-ऑर्डर या पोस्ट-ऑर्डर का उपयोग कब करें?

ट्रावेलर रणनीति प्रोग्रामर का चयन करती है जो एल्गोरिथ्म की विशिष्ट जरूरतों पर निर्भर करती है। लक्ष्य गति है, इसलिए उस रणनीति को चुनें जो आपको सबसे तेज आवश्यकता वाले नोड्स लाती है।

  1. यदि आप जानते हैं कि आपको किसी भी पत्ते का निरीक्षण करने से पहले जड़ों का पता लगाने की आवश्यकता है, तो आप पूर्व-आदेश चुनें क्योंकि आप सभी पत्तियों से पहले सभी जड़ों का सामना करेंगे।

  2. यदि आप जानते हैं कि आपको किसी भी नोड्स से पहले सभी पत्तियों का पता लगाने की आवश्यकता है, तो आप पोस्ट-ऑर्डर का चयन करते हैं क्योंकि आप पत्तियों की खोज में जड़ों का निरीक्षण करने में कोई समय बर्बाद नहीं करते हैं।

  3. यदि आप जानते हैं कि पेड़ की नोड्स में एक अंतर्निहित अनुक्रम है, और आप पेड़ को अपने मूल अनुक्रम में समतल करना चाहते हैं, तो इन-ऑर्डर ट्रैवर्सल का उपयोग किया जाना चाहिए। जिस तरह से इसे बनाया गया था उसी तरह से पेड़ को चपटा किया जाएगा। एक पूर्व-आदेश या पोस्ट-ऑर्डर ट्रैवर्सल पेड़ को उस क्रम में वापस नहीं खोल सकता है, जिसे इसे बनाने के लिए इस्तेमाल किया गया था।

प्री-ऑर्डर, इन-ऑर्डर और पोस्ट-ऑर्डर (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
}

3
गैर-पुनरावर्ती ट्रैवर्सल्स के बारे में क्या? यह मुझे प्रतीत होता है कि इन-ऑर्डर / पोस्ट-ऑर्डर की तुलना में किसी पेड़ को गैर-पुनरावर्ती रूप से पूर्व-क्रम में पार करना बहुत आसान है, क्योंकि इसे पिछले नोड्स पर लौटने की आवश्यकता नहीं है।
bluenote10

@ bluenote10 क्या आप इसका मतलब बता सकते हैं? पूर्व-क्रम में, आप अभी भी अपने बाएं बच्चे को संसाधित करने के बाद अपने दाहिने बच्चे को संसाधित करने के लिए एक नोड पर "वापस" आते हैं। ज़रूर, आप "अभी तक नहीं गए नोड्स" की एक कतार का उपयोग कर सकते हैं, लेकिन यह एक स्पष्ट कतार के लिए वास्तव में सिर्फ व्यापार निहित (स्टैक) भंडारण है। सभी ट्रैवर्सल तरीकों में, बाएं और दाएं दोनों बच्चों को संसाधित किया जाना है, जिसका अर्थ है कि उनमें से एक करने के बाद आपको माता-पिता के लिए "वापस" होना चाहिए।
जोशुआ टेलर

@JoshuaTaylor: हां, वे सभी एक ही जटिलता वर्ग हैं, लेकिन यदि आप विशिष्ट कार्यान्वयन को देखते हैं, तो पोस्ट-ऑर्डर शायद थोड़ा अधिक मुश्किल है।
bluenote10

2
प्री-ऑर्डर ट्रैवर्स प्रविष्टि के अनुक्रम में नोड मान देता है। यदि आप पेड़ की एक प्रति बनाना चाहते हैं तो आपको स्रोत के पेड़ को इस तरह से पार करना होगा। क्रम-क्रम ट्रैवर्स छांटे गए नोड मान देता है। पोस्ट-ऑर्डर ट्रैवर्स के रूप में आप इस पद्धति का उपयोग कर सकते हैं ताकि पूरे पेड़ को हटा दें क्योंकि यह पहले पत्ती नोड्स का दौरा करता है।
एल्बिन

मुझे लगता है कि अगर पेड़ सही क्रम में नहीं है, तो भी मैं सही हूं, मेरा मतलब है कि क्रम क्रमबद्ध क्रम नहीं देगा अगर अनुक्रम पहले क्रमबद्ध नहीं था।
कोडयोगी

29

प्री-ऑर्डर: एक पेड़ की एक प्रति बनाने के लिए उपयोग किया जाता है। उदाहरण के लिए, यदि आप किसी पेड़ की प्रतिकृति बनाना चाहते हैं, तो नोड्स को प्री-ऑर्डर ट्रैवर्सल के साथ एक सरणी में रखें। फिर एक प्रविष्टि करें सरणी में प्रत्येक मान के लिए एक नए पेड़ पर एक ऑपरेशन । आप अपने मूल पेड़ की एक प्रति के साथ समाप्त हो जाएगा।

इन-ऑर्डर:: एक बीएसटी में गैर-घटते क्रम में नोड्स के मूल्यों को प्राप्त करने के लिए उपयोग किया जाता है।

पद-क्रम:: पत्ती से जड़ तक एक पेड़ को हटाने के लिए इस्तेमाल किया जाता है


2
यह एक महान, संक्षिप्त उत्तर है और मुझे पूर्व-आदेश और पोस्ट-ऑर्डर उपयोग मामलों को समझने में मदद मिली। हालाँकि, यह स्पष्ट हो सकता है कि इस प्रश्न का उल्लेख सीधे तौर पर किया गया है, लेकिन ध्यान दें कि यह बाइनरी SEARCH पेड़ों के लिए मामला है और आवश्यक रूप से सामान्य बाइनरी पेड़ों के लिए काम नहीं करता है। उदाहरण के लिए, आप आवश्यक रूप से सामान्य बाइनरी ट्री को कॉपी करने के लिए प्री-ऑर्डर ट्रैवर्सल का उपयोग नहीं कर सकते हैं, क्योंकि प्रतिलिपि प्रक्रिया के दौरान प्रविष्टि तर्क काम नहीं करेगा।
मार्ककीम

7
इन-ऑर्डर:: "गैर-घटते" क्रम में नोड के मूल्यों को प्राप्त करने के लिए - "गैर-बढ़ती" नहीं
rahil008

26

अगर मैं एक लीनियर फॉर्मेट में पेड़ के पदानुक्रमित प्रारूप को बस प्रिंट करना चाहता था, तो शायद मैं प्रीव्यूअर ट्रैवर्सल का उपयोग करूंगा। उदाहरण के लिए:

- ROOT
    - A
         - B
         - C
    - D
         - E
         - F
             - G

4
या TreeViewजीयूआई अनुप्रयोग में एक घटक में।
२३:४६ पर svick

4

पूर्व और बाद के क्रम क्रमशः ऊपर-नीचे और नीचे-ऊपर पुनरावर्ती एल्गोरिदम से संबंधित हैं। यदि आप द्विआधारी पेड़ों पर दिए गए पुनरावर्ती एल्गोरिदम को एक पुनरावृत्त शैली में लिखना चाहते हैं, तो यह वही है जो आप अनिवार्य रूप से करेंगे।

इसके अलावा कि पूर्व और बाद के क्रम के अनुक्रम पूरी तरह से हाथ में पेड़ को निर्दिष्ट करते हैं, एक कॉम्पैक्ट एन्कोडिंग (कम से कम पेड़ों के लिए) उपज देते हैं।


1
मुझे लगता है कि आप कुछ महत्वपूर्ण कहने की कोशिश कर रहे हैं क्या आप कृपया पहले छमाही की व्याख्या कर सकते हैं?
कोडयोगी

@CodeYogi आपको क्या विशेष रूप से समझाया जाना चाहिए?
राफेल

1
"प्री- और पोस्ट-ऑर्डर शीर्ष-डाउन और बॉटम-अप पुनरावर्ती एल्गोरिदम से संबंधित हैं" मुझे लगता है कि आप यह कहना चाहते हैं कि पहले मामले में नोड को पुनरावृत्ति विधियों में से किसी को कॉल करने से पहले संसाधित किया जाता है और इसके बाद वाले, सही में ?
कोडयोगी

@ कोडियोगी हां, मूल रूप से।
राफेल

2

ऐसे कई स्थान हैं जहाँ आप इस अंतर को वास्तविक भूमिका निभाते हैं।

एक महान एक मैं इंगित करता हूँ कि एक संकलक के लिए कोड पीढ़ी में है। कथन पर विचार करें:

x := y + 32

जिस तरह से आप उस के लिए कोड उत्पन्न करेंगे (ज़ाहिर है), पहले एक रजिस्टर में वाई लोड करने के लिए कोड उत्पन्न करना, एक रजिस्टर में 32 लोड करना, और फिर दोनों को जोड़ने के लिए एक निर्देश उत्पन्न करना। क्योंकि कुछ को रजिस्टर करने से पहले आपको इसमें हेरफेर करना होगा (मान लेते हैं, आप हमेशा निरंतर ऑपरेंड कर सकते हैं लेकिन जो भी हो) आपको इसे इस तरह से करना होगा।

सामान्य तौर पर, इस प्रश्न के उत्तर आप मूल रूप से कम कर सकते हैं: अंतर वास्तव में तब होता है जब डेटा संरचना के विभिन्न भागों के प्रसंस्करण के बीच कुछ निर्भरता होती है। आप यह देखते हैं कि तत्वों को प्रिंट करते समय, कोड बनाते समय (बाहरी स्थिति में अंतर होता है, तो आप इस विडंबना को निश्चित रूप से, निश्चित रूप से देख सकते हैं), या संरचना पर अन्य प्रकार की गणना करते समय, जिसमें पहले संसाधित होने वाले बच्चों के आधार पर गणना शामिल होती है। ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.