Στο Haskell, πώς να δημιουργήσει ένα απόλυτα ισορροπημένο δυαδικό δένδρο αναζήτησης;

ψήφοι
3

Η λειτουργία θα πρέπει να διαρκεί λίστα xs και κατασκευάζει μια ισορροπημένη δυαδικό δέντρο αναζήτησης που αποτελείται από ακριβώς το ίδιο σύνολο των στοιχείων όπως xs.

Το αποτέλεσμα θα πρέπει να είναι κάπως έτσι: (αν η λίστα είναι [1,2,3,4,5,6,7,8])

Κόμβος (Node (Node (Node Κενό 1 Κενό) 2 Κενό) 4 (Κόμβος Κενό 4 Κενό)) 5 (Κόμβος (Node Κενό 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

Ταξινόμηση της λίστας εισόδου. Τώρα δημιουργήστε ένα δέντρο του οποίου η ρίζα του κόμβου είναι το μεσαίο στοιχείο της λίστας, και του οποίου το αριστερό και το δεξί υποδένδρων είναι οι υποδένδρων που δημιουργούνται από την εφαρμογή αυτής της διαδικασίας στους υποκαταλόγους προς τα αριστερά και δεξιά από το κέντρο, αντίστοιχα.

Στο Haskell:

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