संतुलित बाइनरी सर्च ट्री ओ (लॉग एन) लुकअप (या इसी तरह के संचालन) की गारंटी देने के लिए आवश्यक हैं । एक गतिशील वातावरण में जहाँ बहुत सी कुंजियाँ बेतरतीब ढंग से डाली जाती हैं और / या हटाई जाती हैं, पेड़ लिंक किए गए सूचियों को पतित कर सकते हैं जो कि लुक के लिए भयानक हैं। इस प्रकार विभिन्न प्रकार के स्व-संतुलन वाले द्विआधारी वृक्ष हैं जो इस प्रभाव का प्रतिकार करते हैं (जैसे कि एवीएल पेड़ या चटकते पेड़ )। ये पेड़ विभिन्न प्रकार के घुमावों पर आधारित होते हैं जो पेड़ को फिर से संतुलित करते हैं।
रोटेशन
इस चुनौती में हम केवल एकल दाएं-रोटेशन को देखेंगे, ऐसा रोटेशन (बाएं-रोटेशन सममित होगा) इस तरह दिखता है:
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
यदि पत्तियों में से कोई भी 1
, 4
या 6
दाएं या बाएं उप-पेड़ एक रोटेशन था, तो बस उन्हें वहां रखा जाएगा। यदि यह एक बड़े पेड़ का उप-योग है, तो हम नोड पर "इसे काट देंगे" और उस नोड के 5
लिए घुमाए गए पेड़ (अब नोड 3
) को "पुनः संलग्न" करेंगे।
चुनौती
एक बाइनरी सर्च ट्री 1 को देखते हुए और ऊपर बताए अनुसार उस नोड पर ट्री को राइट-रोटेट करें। उपरोक्त उदाहरण में दी गई कुंजी होगी 5
।
नियम और आई / ओ
- आप कुंजी के लिए किसी भी प्रकार का उपयोग कर सकते हैं जब तक कि आपकी पसंद की कुंजी और परीक्षण मामलों के बीच कोई आपत्ति न हो
- आप बाइनरी पेड़ों के लिए किसी भी प्रतिनिधित्व का चयन कर सकते हैं जब तक कि कोई अस्पष्टता न हो (जैसे
[3,[]]
कि अस्पष्ट है जब तक कि अन्यथा निर्दिष्ट न हो) और यह आपकी पसंद की भाषा के लिए स्वाभाविक है - चूंकि इनपुट हमेशा एक द्विआधारी खोज ट्री होगा, कोई डुप्लिकेट कुंजी नहीं है
- आप मान सकते हैं कि कुंजी पेड़ में निहित है
- आप मान सकते हैं कि कुंजी वाले नोड में एक बाएं बच्चा है
- आप प्रदान की गई कुंजी के तहत एक सही सबट्री नहीं मान सकते हैं
- आप यह नहीं मान सकते हैं कि पेड़ रोटेशन से पहले असंतुलित है
- आप यह नहीं मान सकते हैं कि पेड़ रोटेशन के बाद संतुलित है
- आप किसी भी डिफ़ॉल्ट I / O विधि का उपयोग कर सकते हैं
- आपका सबमिशन एक ऐसा फंक्शन हो सकता है जो पेड़ या पूर्ण कार्यक्रम को हल करता है
परीक्षण के मामलों
ये उदाहरण एक पेड़ का प्रतिनिधित्व करते हैं
- अगर यह एक पत्ती है:
[]
- यदि यह कुंजी वाला पेड़ है
x
और दोनों उपप्रकार पत्तियां हैं:[x]
- यदि यह कुंजी वाला पेड़ है
x
और इसे घटाया गया हैleft
right
:[x,left,right]
पहला उदाहरण खंड घुमावों में प्रदान किया गया एक है । यदि किसी कारण से आपको उनमें से एक चित्रमय प्रतिनिधित्व की आवश्यकता है, तो यहां 2 आप जाएं।
5 [5,[3,[1],[4]],[6]] -> [3,[1],[5,[4],[6]]]
5 [5,[3,[1],[4]],[]] -> [3,[1],[5,[4],[]]]
5 [5,[3,[],[4]],[6]] -> [3,[],[5,[4],[6]]]
5 [5,[3,[1],[]],[]] -> [3,[1],[5]]
4 [8,[4,[2,[1],[3]],[6,[5],[7]]],[12,[10,[9],[11]],[14,[13],[15]]]] -> [8,[2,[1],[4,[3],[6,[5],[7]]]],[12,[10,[9],[11]],[14,[13],[15]]]]
8 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [10,[6,[4,[2,[],[3]],[5]],[8,[7],[9]]],[11]]
10 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [8,[6,[4,[2,[],[3]],[5]],[7]],[10,[9],[11]]]
9 [6,[3,[2],[5]],[9,[8],[12,[11],[15,[14],[]]]]] -> [6,[3,[2],[5]],[8,[],[9,[],[12,[11],[15,[14],[]]]]]]
7 [7,[5,[3,[1],[4]],[6]],[8]] -> [5,[3,[1],[4]],[7,[6],[8]]]
15 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[13,[11,[10],[12]],[15,[14],[16]]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
21 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[19,[18],[21,[20],[24,[22],[25]]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
1: इसका मतलब है कि किसी भी नोड के लिए बाईं सबट्री की सभी कुंजियाँ उस कुंजी से छोटी होंगी और सही सबट्री की सभी कुंजियाँ इससे अधिक हैं।
2: लिंक-रोट को रोकने के लिए, मैंने उन्हें एक टिप्पणी के रूप में एम्बेड किया
data B=B[B]Int
कुछ और बाइट्स बचेंगे।