In Haskell, come generare un perfetto equilibrio albero binario di ricerca?

voti
3

La funzione dovrebbe prende una lista xs e costruisce un albero binario di ricerca equilibrata composta da esattamente lo stesso insieme di elementi come xs.

Il risultato dovrebbe essere simile a questo: (se la lista è [1,2,3,4,5,6,7,8])

Nodo (Node (nodo (Node vuoto 1 Vuoto) 2 vuoto) 4 (nodo vuoto 4 Vuoto)) 5 (nodo (Node Vuoto 6 Vuoto) 7 (nodo vuoto 8 Vuoto))

vale a dire che l'albero dovrebbe essere simile a questo:

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

piuttosto che questo:

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

Qualcuno potrebbe dirmi come fare questo? Trovo che posso fare il secondo albero, che non è perfettamente bilanciata, ma non so come fare il primo.

Apprezzo tutto l'aiuto !! Grazie in anticipo!

È pubblicato 30/09/2013 alle 09:56
fonte dall'utente
In altre lingue...                            


2 risposte

voti
7

Ordinare l'elenco di ingresso. Ora creare un albero il cui nodo radice è l'elemento centrale della lista, e la cui sottoalberi sinistro e destro sono sottoalberi generati applicando questo processo per i sottoelenchi a sinistra ea destra del centro, rispettivamente.

In 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))
Risposto il 30/09/2013 a 10:06
fonte dall'utente

voti
0

Se la parte superiore della struttura deve essere l'elemento centrale:

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'

Altrimenti:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Risposto il 01/10/2013 a 23:56
fonte dall'utente

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