In Haskell, hoe je een perfect uitgebalanceerde binaire zoekboom te genereren?

stemmen
3

De functie moet neemt een lijst xs en construeert een evenwichtige binaire zoekboom, bestaande uit exact dezelfde set van elementen als xs.

Het resultaat moet zijn als volgt: (als de lijst [1,2,3,4,5,6,7,8])

Knooppunt (knooppunt (knooppunt (knooppunt leeg 1 ingevuld) 2 leeg) 4 (knooppunt ingevuld 4 ingevuld)) 5 (knooppunt (knooppunt Empty 6 leeg) 7 (8 knooppunt leeg leeg))

dat wil zeggen dat de boom moet er zo uitzien:

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

in plaats van dit:

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

Kan iemand mij vertellen hoe dit te doen? Ik vind ik kan de tweede boom die niet perfect in balans te doen, maar weet niet hoe je de eerste te doen.

Ik waardeer alle hulp !! Dank u bij voorbaat!

De vraag is gesteld op 30/09/2013 om 09:56
bron van user
In andere talen...                            


2 antwoorden

stemmen
7

Sorteer de ingang lijst. Maak nu een boom waarvan hoofdknooppunt het middelste element van de lijst en waarvan de linker- en rechter sub-bomen zijn deelbomen gegenereerd door deze werkwijze de sublijsten links en rechts van het midden, resp.

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))
antwoordde op 30/09/2013 om 10:06
bron van user

stemmen
0

Als de top van de boom het middelste element moet zijn:

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'

Als niet:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
antwoordde op 01/10/2013 om 23:56
bron van user

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