एक तरह से इस समस्या के बारे में सोचने के लिए तथ्य यह है कि पेड़ की एक inorder की पैदल दूरी पर क्रमबद्ध क्रम में सभी तत्त्व का उत्पादन करेगा उपयोग करने के लिए है। यदि आप इस सैर के दौरान सॉर्ट किए गए क्रम से विचलन का पता लगा सकते हैं, तो आप गलत जगह पर मौजूद दो तत्वों को ढूंढने का प्रयास कर सकते हैं।
चलो देखते हैं कि इसे सरल सॉर्ट किए गए सरणी के लिए पहले कैसे करें, फिर पेड़ पर काम करने वाले कुछ बनाने के लिए हमारे एल्गोरिदम का उपयोग करेंगे। सहजता से, अगर हम एक क्रमबद्ध सरणी के साथ शुरू करते हैं और फिर दो (गैर-बराबर!) तत्वों को स्वैप करते हैं, तो हम सरणी में कुछ तत्वों के साथ समाप्त हो जाएंगे। उदाहरण के लिए, दिए गए सरणी
1 2 3 4 5
अगर हम स्वैप 2 और 4, हम इस सरणी के साथ अंत:
1 4 3 2 5
हम कैसे पता लगाता है कि 2 और 4 यहाँ बदली कर रहे थे? खैर, चूंकि 4 दो तत्वों में से अधिक है और नीचे की ओर घुमाया गया था, यह इसके चारों ओर के दोनों तत्वों से बड़ा होना चाहिए। इसी तरह, क्योंकि 2 को बदल दिया गया था, यह इसके चारों ओर के दोनों तत्वों से छोटा होना चाहिए। इससे, हम निष्कर्ष निकाल सकते हैं कि 2 और 4 स्वैप किए गए थे।
हालांकि, यह हमेशा सही ढंग से काम नहीं करता है। उदाहरण के लिए, मान लीजिए कि हम स्वैप 1 और 4:
4 2 3 1 5
यहाँ, दोनों 2 और 1 उनके पड़ोसी तत्वों की तुलना में छोटे हैं, और दोनों 4 और 3 उनकी से बड़े होते हैं।इससे हम बता सकते हैं कि इनमें से दो चार किसी भी तरह से बदल दिए गए थे, लेकिन यह स्पष्ट नहीं है कि हमें किसके साथ आदान-प्रदान करना चाहिए। हालांकि, अगर हम इन मूल्यों में से सबसे बड़ा और सबसे छोटा (क्रमशः 1 और 4) लेते हैं, तो हम उस जोड़ी को बदल देते हैं जो स्वैप किया गया था।
आम तौर पर, तत्वों है कि अनुक्रम में बदली रहे थे खोजने के लिए, आप
- सरणी में सबसे बड़ा स्थानीय अधिकतम लगाना चाहते हैं।
- सरणी में सबसे छोटा स्थानीय न्यूनतम।
ये दो तत्व जगह से बाहर हैं और उन्हें बदला जाना चाहिए।
अब, चलो पेड़ों पर इसे कैसे लागू करें इसके बारे में सोचें। चूंकि पेड़ की एक अंदरूनी पैदल दूरी क्रमशः दो तत्वों के साथ सॉर्ट किए गए अनुक्रम का उत्पादन करेगी, एक विकल्प पेड़ पर चलना होगा, हमारे द्वारा पाए गए तत्वों के क्रम अनुक्रम को रिकॉर्ड करना होगा, फिर उपरोक्त एल्गोरिदम का उपयोग करना होगा। पर हम पाते हैं
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
सूचना है कि 16 उसके आसपास के तत्वों से अधिक है हम एक सरणी में इस linearize तो
20
/ \
15 30
/ \ / \
10 17 25 33
/| /\ /\ | \
9 16 12 18 22 26 31 34
और कहा कि 12 अपने से भी कम है: उदाहरण के लिए, अपने मूल BST पर विचार करें। यह तुरंत हमें बताता है कि 12 और 16 स्वैप किए गए थे।
इस समस्या को हल करने के लिए एक सरल एल्गोरिथ्म, इसलिए, एक vector
या deque
की तरह एक दृश्य में यह linearize को पेड़ की एक inorder की पैदल दूरी पर ऐसा करने के लिए किया जाएगा, तो उस अनुक्रम स्कैन करने के लिए सबसे बड़ा स्थानीय अधिकतम और सबसे छोटा लगता है स्थानीय न्यूनतम ओ ओ (एन) स्पेस का उपयोग करके ओ (एन) समय में चलाया जाएगा। एक ट्रिकियर लेकिन अधिक स्पेस-कुशल एल्गोरिदम केवल एक समय में तीन नोड्स का ट्रैक रखना होगा - वर्तमान नोड, इसके पूर्ववर्ती, और इसके उत्तराधिकारी - जो स्मृति उपयोग को ओ (1) में कम कर देता है।
आशा है कि इससे मदद मिलती है!
गेटमैक्स और गेटमिन क्या करता है? यह मुझे स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। – phoxis
@phoxis: getMax और getMin मुख्य रूट के बाएं और दाएं उपट्री में अधिकतम और न्यूनतम तत्व ढूंढें। – Cipher
आपका मतलब है: आपके पास बीएसटी था, दो नोड्स को "अवैध रूप से" बदल दिया गया है (इसलिए आपकी संरचना अब बीएसटी नहीं है) और आप जानना चाहते हैं? –