प्री-ऑर्डर + पोस्ट-ऑर्डर टू इन-ऑर्डर


11

कार्य

पूर्ण बाइनरी ट्री के प्री-ऑर्डर और पोस्ट-ऑर्डर ट्रैवर्सल्स को देखते हुए, इसके इन-ऑर्डर ट्रैवर्सल को वापस करें।

Traversals दो सूचियों, दोनों से युक्त के रूप में प्रतिनिधित्व किया जाएगा n अलग धनात्मक पूर्णांक, प्रत्येक विशिष्ट एक नोड की पहचान। आपका प्रोग्राम इन सूचियों को ले सकता है, और परिणामी-ऑर्डर ट्रैवर्सल का उत्पादन कर सकता है, किसी भी उचित I / O प्रारूप का उपयोग कर।

आप मान सकते हैं कि इनपुट वैध है (अर्थात, सूचियाँ वास्तव में किसी पेड़ के ट्रैवर्सल्स का प्रतिनिधित्व करती हैं)।

यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है।

परिभाषाएं

एक पूर्ण बाइनरी ट्री नोड्स की एक परिमित संरचना है , जिसे यहां अद्वितीय सकारात्मक पूर्णांक द्वारा दर्शाया गया है।

एक पूर्ण बाइनरी ट्री या तो एक पत्ती है , जिसमें एक नोड होता है :

                                      1

या एक शाखा , जिसमें दो उपप्रकारों (जिसे बाएं और दाएं उपप्रकार कहा जाता है ) के साथ एक नोड होता है, जिसमें से प्रत्येक, बदले में, एक पूर्ण बाइनरी ट्री होता है:

                                      1
                                    /   \
                                  …       …

यहाँ एक पूर्ण बाइनरी ट्री का पूरा उदाहरण दिया गया है:

                                        6
                                      /   \
                                    3       4
                                   / \     / \
                                  1   8   5   7
                                     / \
                                    2   9

प्री-ऑर्डर ट्रेवर्सल एक पूर्ण द्विआधारी पेड़ के रिकर्सिवली इस प्रकार परिभाषित किया गया है:

  • एक नोड n युक्त पत्ती का पूर्व-क्रम अनुक्रमणिका सूची [ n ] है।
  • नोड n और उप-पेड़ (L, R) युक्त शाखा का पूर्व-क्रम अनुक्रमणिका सूची [ n ] +  प्रीऑर्डर ( L ) +  प्रीऑर्डर ( R ) है, जहां + सूची सुगम संचालक है।

उपरोक्त पेड़ के लिए, यह [6, 3, 1, 8, 2, 9, 4, 5, 7] है


बाद आदेश ट्रावर्सल एक पूर्ण द्विआधारी पेड़ के रिकर्सिवली इस प्रकार परिभाषित किया गया है:

  • नोड एन युक्त एक पत्ती के बाद के आदेश का निशान सूची [ एन ] है।
  • नोड n और उप-पेड़ (L, R) युक्त शाखा का पोस्ट-ऑर्डर ट्रैवर्सल सूची पोस्टऑर्डर ( L ) +  पोस्टऑर्डर ( R ) + [ n ] है।

उपरोक्त पेड़ के लिए, यह [1, 2, 9, 8, 3, 5, 7, 4, 6] है


इन-आदेश ट्रावर्सल एक पूर्ण द्विआधारी पेड़ के रिकर्सिवली इस प्रकार परिभाषित किया गया है:

  • नोड एन युक्त पत्ती का इन-ऑर्डर ट्रैवर्सल सूची [ एन ] है।
  • नोड n और उप-पेड़ (L, R) युक्त शाखा का इन-ऑर्डर ट्रैवर्सल सूची इन्वर्टर ( L ) + [ n ] +  इन्वर्टर ( R ) है।

उपरोक्त पेड़ के लिए, यह [1, 3, 2, 8, 9, 6, 5, 4, 7] है


निष्कर्ष में: सूचियों की जोड़ी [6, 3, 1, 8, 2, 9, 4, 5, 7] (पूर्व) और [1, 2, 9, 8, 3, 5, 7, 4, 6] (पोस्ट) इनपुट के रूप में, आपके प्रोग्राम का आउटपुट [1, 3, 2, 8, 9, 6, 5, 4, 7] होना चाहिए

परीक्षण के मामलों

प्रत्येक परीक्षण मामला प्रारूप में है preorder, postorder → expected output

[8], [8] → [8]
[3,4,5], [4,5,3] → [4,3,5]
[1,2,9,8,3], [9,8,2,3,1] → [9,2,8,1,3]
[7,8,10,11,12,2,3,4,5], [11,12,10,2,8,4,5,3,7] → [11,10,12,8,2,7,4,3,5]
[1,2,3,4,5,6,7,8,9], [5,6,4,7,3,8,2,9,1] → [5,4,6,3,7,2,8,1,9]

चूँकि इनपुट के लिए विशिष्ट आकार (पूर्ण बाइनरी ट्री) की गारंटी है, आपको वास्तव में दोनों इनपुट की आवश्यकता नहीं है, क्या आपको?
feersum

बाइनरी ट्री भरा हुआ है , लेकिन पूरा नहीं है , इसलिए एक n -element ट्री में कई आकार हो सकते हैं, और, सामान्य तौर पर, आपको दोनों की आवश्यकता होती है।
लिन

क्या मैं आदेशों के लिए तार देने वाले एकल अक्षरों के रूप में नोड्स का प्रतिनिधित्व करता हूं। उदाहरण के लिए दूसरा उदाहरण बन जाएगा "CDE" and "DEC" give "DCE":? (यहां तक ​​कि अगर मुझे बहुत सारे नोड्स की आवश्यकता है तो यूनिकोड अक्षरों का उपयोग करना)
टन हास्पेल

@TonHharma मैं इसके साथ ठीक हो जाऊंगा - यकीनन, आप जो कर रहे हैं, वह पूर्णांकों की एक सूची की परिभाषा को थोड़ा बढ़ा रहा है , क्योंकि :) "CDE"से बहुत अलग नहीं है[67, 68, 69]
लिन

जवाबों:


2

पर्ल, 69 66 62 56 53 बाइट्स

के लिए +1 शामिल है -p

STDIN (पूर्व और पोस्ट के आदेश पर ध्यान दें) पर अंतरिक्ष द्वारा अलग की गई एक लाइन के रूप में प्रीऑर्डर के बाद पोस्टकार्ड ले जाता है। नोड्स को अद्वितीय अक्षरों (किसी भी वर्ण जो स्पेस या न्यूलाइन ठीक नहीं है) के रूप में दर्शाया जाता है।

inpost.pl <<< "98231 12983"

inpost.pl:

#!/usr/bin/perl -p
s%(.)(.)+\K(.)(.+)\3(\1.*)\2%$4$5$3$2%&&redo;s;.+ ;;

मूल विशुद्ध रूप से संख्यात्मक प्रारूप का उपयोग करने के लिए एक एकल संख्या की पहचान करने के लिए बहुत अधिक देखभाल की आवश्यकता होती है और 73 बाइट्स में आता है

#!/usr/bin/perl -p
s%\b(\d+)(,\d+)+\K,(\d+\b)(.+)\b\3,(\1\b.*)\2\b%$4$5,$3$2%&&redo;s;.+ ;;

इस रूप में उपयोग करें

inpostnum.pl <<< "11,12,10,2,8,4,5,3,7 7,8,10,11,12,2,3,4,5"

-p;अंत में जोड़ता है , इसलिए आपको अंतिम की आवश्यकता नहीं है ;s;.* ;;->s;.* ;
रिले

@ रिले मुझे पता है। इसलिए मेरे पास ;सबसे अंत में है। लेकिन -p वास्तव \n;में एक -eकार्यक्रम में अंत तक जोड़ता है । एक फ़ाइल में यह सिर्फ ;और सिर्फ तभी जुड़ता है जब फ़ाइल समाप्त नहीं होती है \n। चूंकि मैं -p+1 के रूप में दावा करना चाहता हूं और न कि +3 प्रोग्राम को कमांडलाइन से काम करने की आवश्यकता है, इसलिए -e। और मैं नहीं चाहता कि जो आउटपुट मुझे
मिले, उसमें

यदि आप इसे कमांडलाइन पर चलाते हैं तो क्या आपको 'इसके आसपास की आवश्यकता नहीं है? यदि आप इसे अपने पास रखते हैं, तो आपके पास एक फ़ाइल है ( <<<आप के साथ एक फ़ाइल को कॉल करें ) आप अंतिम ;बंद छोड़ सकते हैं ।
रिले

@ रिले यह पर्ल के लिए स्कोरिंग विधि की व्याख्या पर निर्भर करता है। मैं आमतौर पर अपने कोड को एक फ़ाइल के रूप में प्रस्तुत करता हूं क्योंकि मुझे लगता है कि यह अल्पकालिक है। लेकिन अगर आप मेरे सबमिशन को देखते हैं तो आप देखेंगे कि अगर कोड एक फाइल में होना चाहिए (क्योंकि जैसे इसके पास है 'या उपयोग करता है do$0आदि) मैं हमेशा -p+3 (स्पेस, माइनस, पी) के रूप में स्कोर करता हूं , लेकिन अगर कोड भी काम करेगा कमांडलाइन पर, जहां आपको मिलता है -eऔर 'मुफ्त में मैं इसे स्कोर करता हूं +1क्योंकि इसे e
बन्धु के

ठीक है, मैं अभी तक बिल्कुल स्पष्ट नहीं था कि कमांड लाइन प्रस्तुतियाँ कैसे स्कोर करती हैं। मुझे एहसास नहीं था कि आप 'मुफ्त में मिलेंगे । इसे साफ करने के लिए धन्यवाद।
रिले

3

हास्केल, 84 83 बाइट्स

(a:b:c)#z|i<-1+length(fst$span(/=b)z),h<- \f->f i(b:c)#f i z=h take++a:h drop
a#_=a

2

जावास्क्रिप्ट (ईएस 6), 100 बाइट्स

f=(s,t,l=t.search(s[1]))=>s[1]?f(s.slice(1,++l+1),t.slice(0,l))+s[0]+f(s.slice(l+1),t.slice(l)):s[0]

I / O "सुरक्षित" वर्णों (जैसे अक्षर या अंक) के तार में है। वैकल्पिक दृष्टिकोण, 100 बाइट्स:

f=(s,t,a=0,b=0,c=s.length-1,l=t.search(s[a+1])-b)=>c?f(s,t,a+1,b,l)+s[a]+f(s,t,l+2+a,l+1,c-l-2):s[a]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.