मैं बाद में प्रसंस्करण के लिए एक सूची में एक बाइनरी पेड़ को फ़्लैट करने के बारे में सोच रहा था।हास्केल: फ्लैट बाइनरी पेड़
मैंने पहली बार बाएं और दाएं शाखाओं में शामिल होने के लिए (++)
का उपयोग करने का विचार किया, लेकिन फिर खराब स्थिति में सोचा जो O(n^2)
समय लेगा।
मैंने बाद में रैखिक समय में आगे बढ़ने के लिए (:)
का उपयोग करके सूची को पीछे की ओर बनाने का विचार किया। हालांकि, मैंने सोचा कि अगर मैं इस सूची को एक फोल्ड-फ़ंक्शन पर भेजता हूं, तो उसे तब तक इंतजार करना पड़ेगा जब तक कि पूरे पेड़ को फोल्डिंग शुरू करने से पहले ट्रैवर्स नहीं किया जाता है, और इसलिए list fusion का उपयोग नहीं कर सकता।
मैं तो following के साथ आया था:
data Tree a = Node a (Tree a) (Tree a) | Tip
flatten :: Tree a -> [a]
flatten x = (flatten' x) []
flatten' :: Tree a -> [a] -> [a]
flatten' (Node x left right) l = (flatten' left (x:(flatten' right l)))
flatten' Tip l = l
main =
putStrLn $ show $ flatten $
(Node 2 (Node 1 Tip Tip) (Node 4 (Node 3 Tip Tip) Tip))
करेंगे O(n)
समय में इस काम है, पेड़ की सबसे बड़ी गहराई को "ढेर अंतरिक्ष" कोई आनुपातिक की तुलना में अधिक लेने के लिए और यह एक उपभोक्ता के साथ जुड़े हुए किया जा सकता है कार्य (यानी मध्यवर्ती सूची समाप्त)? क्या यह एक पेड़ को फटकारने का "सही" तरीका है?
http://hackage.haskell.org/packages/archive/containers/latest/doc/html/src/Data-Map-Base.html#foldl –
जैसा कि लुक्वी बताता है, यह एक अंतर सूची तकनीक है। [यह] (http://stackoverflow.com/a/10584256/849891) और [यह] (http://stackoverflow.com/a/9550430/849891) भी संबंधित हैं। –