एक तरह से इस समस्या के बारे में सोचने के लिए तथ्य यह है कि पेड़ की एक inorder की पैदल दूरी पर क्रमबद्ध क्रम में सभी तत्त्व का उत्पादन करेगा उपयोग करने के लिए है। आप इस चलने के दौरान क्रमबद्ध आदेश से विचलन का पता लगा सकते हैं, तो आप दो तत्वों है कि गलत जगह में हैं का पता लगाने की कोशिश कर सकते हैं।
चलो कैसे पहले एक सरल क्रमबद्ध सरणी के लिए यह करने के लिए देखते हैं, तो हमारे एल्गोरिथ्म का उपयोग करेगा कुछ है कि पेड़ पर काम करता है बनाने के लिए। Intuitively, अगर हम एक क्रमबद्ध सरणी के साथ शुरू और फिर दो (गैर बराबर!) तत्वों स्वैप, हम सरणी जगह से बाहर किया जा रहा है में तत्वों में से कुछ संख्या के साथ खत्म हो जाएगा। उदाहरण के लिए, सरणी दिया
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, क्रमशः) की सबसे छोटी ले, हम जोड़ी है कि बदली था हो रही अंत।
आम तौर पर, तत्वों है कि अनुक्रम में बदली रहे थे खोजने के लिए, आप ढूंढना चाहते हैं
- सरणी में सबसे बड़ा स्थानीय अधिकतम।
- सरणी में सबसे छोटी स्थानीय न्यूनतम।
इन दोनों तत्वों जगह से बाहर हैं और बदली किया जाना चाहिए।
अब, चलो कैसे पेड़ों को यह लागू करने के लिए के बारे में सोचते हैं। पेड़ के आदेश से बाहर दो तत्वों के साथ हल कर अनुक्रम का उत्पादन करेगा के एक inorder की पैदल दूरी के बाद से, एक ही विकल्प पेड़ चलने के लिए, रिकॉर्डिंग तत्वों की inorder अनुक्रम हमने पाया है, फिर ऊपर कलन विधि का उपयोग किया जाएगा। उदाहरण के लिए, अपने मूल BST पर विचार करें:
20
/ \
15 30
/ \ / \
10 17 25 33
/ | / \ / \ | \
9 16 12 18 22 26 31 34
हम एक सरणी में इस linearize, तो हम मिल
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
ध्यान दें कि 16 उसके आसपास के तत्वों से बड़ा है और है कि 12 अपने से कम है। यह तुरंत हमें बताता है कि 12 और 16 की अदला-बदली की गई।
इस समस्या को हल करने के लिए एक सरल एल्गोरिथ्म, इसलिए, एक तरह एक अनुक्रम में यह linearize को पेड़ की एक inorder की पैदल दूरी पर ऐसा करने के लिए किया जाएगा vectorया deque, तो उस अनुक्रम स्कैन करने के लिए सबसे बड़ा स्थानीय अधिकतम और सबसे छोटी स्थानीय न्यूनतम खोजने के लिए। यह हे (एन) समय में किये हैं, हे (एन) स्थान का उपयोग कर। वर्तमान नोड, अपने पूर्ववर्ती, और उसके उत्तराधिकारी - - करने के लिए एक बार में केवल तीन नोड्स का ट्रैक रखने के लिए एक जटिल काम है, लेकिन और अधिक स्थान की कुशल एल्गोरिथ्म होगा जो हे करने के लिए स्मृति के उपयोग को कम कर देता है (1)।
उम्मीद है की यह मदद करेगा!