हास्केल में, कैसे एक अच्छी तरह से संतुलित द्विआधारी खोज वृक्ष उत्पन्न करने के लिए?

वोट
3

समारोह एक सूची XS लेता है और वास्तव में XS जैसे तत्वों का एक ही सेट से मिलकर एक संतुलित द्विआधारी खोज वृक्ष का निर्माण करना चाहिए।

परिणाम इस तरह होना चाहिए: (सूची है अगर [1,2,3,4,5,6,7,8])

नोड (नोड (नोड (नोड रिक्त 1 रिक्त) 2 रिक्त) 4 (नोड रिक्त 4 रिक्त)) 5 (नोड (नोड रिक्त 6 रिक्त) 7 (नोड रिक्त 8 रिक्त))

ऐसा कहा जा सकता पेड़ इस तरह दिखना चाहिए है:

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

बल्कि इस से:

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

किसी को भी मुझे बता सकते हैं कि यह कैसे करना है? मुझे लगता है मैं दूसरे पेड़ जो पूरी तरह से संतुलित नहीं है क्या कर सकते हैं लगता है, लेकिन कैसे पहले एक करने के लिए पता नहीं है।

मैं किसी भी मदद की सराहना करते हैं !! आपका अग्रिम में ही बहुत धन्यवाद!

30/09/2013 को 09:56
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
7

इनपुट सूची को क्रमित करें। अब एक पेड़ जिसका रूट नोड सूची के बीच तत्व, और जिसका बाएँ और दाएँ subtrees, छोड़ दिया और केंद्र के अधिकार के लिए उप-सूचियों को इस प्रक्रिया को लागू करने के क्रमशः द्वारा उत्पन्न subtrees हैं पैदा करते हैं।

हास्केल में:

buildBalanced []   = Empty
buildBalanced elts = Node (buildBalanced $ take half elts) 
                          (elts !! half) 
                          (buildBalanced $ drop (half+1) elts)
    where half = length elts `quot` 2

main = putStrLn $ show $ buildBalanced [1,2,3,4,5,6,7,8]
-- prints Node (Node (Node (Node Empty 1 Empty) 2 Empty) 3 (Node Empty 4 Empty)) 5 (Node (Node Empty 6 Empty) 7 (Node Empty 8 Empty))
30/09/2013 को 10:06
का स्रोत उपयोगकर्ता

वोट
0

पेड़ के शीर्ष मध्य तत्व होना चाहिए हैं:

mkBalanced [] = Empty
mkBalanced xs = Node mid (mkBalanced half0) (mkBalanced half1)
    where (half0, half') = splitAt ((length xs `div` 2) - 1) xs
          half1 = tail half'
          mid = head half'

अगर नहीं:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
01/10/2013 को 23:56
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more