मैं How does inorder+preorder construct unique binary tree? पर देख रहा था और सोचा था कि इडिस में इसका औपचारिक सबूत लिखना मजेदार होगा। दुर्भाग्य से, मैं साबित करने की कोशिश कर रहा हूं कि पेड़ में एक तत्व खोजने के तरीके इसके अंदरूनी ट्रैवर्सल में खोजने के तरीकों से मेल खाते हैं (बेशक, मुझे प्रीऑर्डर ट्रैवर्सल के लिए भी ऐसा करने की आवश्यकता होगी) । किसी भी विचार का स्वागत है। मैं विशेष रूप से एक पूर्ण समाधान में रूचि नहीं रखता हूं- बस सही दिशा में शुरू करने में मदद करें।मैं एक पेड़ और इसके ट्रैवर्सल के बीच एक विभाजन कैसे स्थापित कर सकता हूं?
को देखते हुए
data Tree a = Tip
| Node (Tree a) a (Tree a)
मैं कम से कम दो तरह से एक सूची में परिवर्तित कर सकते हैं:
inorder : Tree a -> List a
inorder Tip = []
inorder (Node l v r) = inorder l ++ [v] ++ inorder r
या
foldrTree : (a -> b -> b) -> b -> Tree a -> b
foldrTree c n Tip = n
foldrTree c n (Node l v r) = foldr c (v `c` foldrTree c n r) l
inorder = foldrTree (::) []
दूसरा दृष्टिकोण काफी सब कुछ करने के लिए लगता है मुश्किल है, इसलिए मेरे अधिकांश प्रयासों ने पहले पर ध्यान केंद्रित किया है।
inTreeThenInorder : {x : a} -> (t : Tree a) -> x `InTree` t -> x `Elem` inorder t
लिखने के लिए (inorder
की पहली परिभाषा का उपयोग)
data InTree : a -> Tree a -> Type where
AtRoot : x `InTree` Node l x r
OnLeft : x `InTree` l -> x `InTree` Node l v r
OnRight : x `InTree` r -> x `InTree` Node l v r
यह काफी आसान है और परिणाम एक बहुत सरल संरचना है कि सबूत के लिए उचित रूप से अच्छी लगती है है: मैं इस तरह पेड़ में स्थानों का वर्णन ।
यह भी
inorderThenInTree : x `Elem` inorder t -> x `InTree` t
दुर्भाग्य का एक संस्करण लिखने के लिए बहुत मुश्किल नहीं है, मैं नहीं, अभी तक, ऊपर किसी भी तरह से साथ inorderThenInTree
का एक संस्करण लिखने के लिए है कि मैं साबित करने के लिए है कर लिया है आए हैं inTreeThenInorder
के विपरीत। केवल
listSplit : x `Elem` xs ++ ys -> Either (x `Elem` xs) (x `Elem` ys)
और मैं वहां से वापस आने की कोशिश में परेशानी में भाग गया।
कुछ सामान्य विचारों मैंने कोशिश की:
Vect
List
के बजाय का उपयोग करते हुए यह आसान बाहर काम करने के क्या बाईं तरफ है और क्या सही पर है बनाने के लिए प्रयास करने के लिए। मैं इसके "हरे रंग की कीचड़" में फंस गया।वृक्षारोपण के साथ चारों ओर बजाना, यह साबित करने के लिए कि पेड़ की जड़ पर घूर्णन एक अच्छी तरह से स्थापित संबंध में जाता है। (मैंने नीचे घूर्णन के साथ नहीं खेला था, क्योंकि मैं इन रोटेशन के बारे में कुछ भी उपयोग करने में कभी भी सक्षम नहीं था)।
पेड़ नोड्स को कैसे सजाने के बारे में जानकारी के साथ सजाने की कोशिश कर रहा है। मैंने इस पर बहुत लंबा खर्च नहीं किया क्योंकि मैं उस दृष्टिकोण के माध्यम से कुछ भी दिलचस्प व्यक्त करने का तरीका नहीं सोच सका।
इस सबूत का निर्माण करने की कोशिश कर रहा है कि हम वापस जा रहे हैं जहां हमने ऐसा कार्य करने के दौरान शुरू किया था। यह बहुत गन्दा हो गया, और मैं कहीं या दूसरे अटक गया।
मैंने अंत में अपना मूल लक्ष्य पूरा किया (यह साबित करना कि अगर पेड़ में कोई डुप्लिकेट तत्व नहीं है और उसी पेड़ के रूप में वही प्रीऑर्डर और इनऑर्डर ट्रैवर्सल हैं तो पेड़ बराबर हैं)। [इस उत्तर] पर एक नज़र डालें (http://stackoverflow.com/a/30566218/1477667)। सुधार के लिए सुझावों का बहुत स्वागत किया जाएगा। – dfeuer