I Haskell, hvordan å generere en perfekt balansert binært søketre?

stemmer
3

Funksjonen skal tar en liste xs og konstruerer en balansert binært søk treet som består av nøyaktig det samme sett av elementer som xs.

Resultatet skal bli som dette: (hvis listen er [1,2,3,4,5,6,7,8])

Knutepunktet (knutepunkt (knutepunktet (knutepunkt Tom en tom) 2 Tom) 4 (node ​​Tom 4 tomme)) 5 (knutepunktet (knutepunkt Tom Tom 6) syv (Node Tom Tom 8))

det vil si at treet skal se slik ut:

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

snarere enn dette:

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

Kan noen fortelle meg hvordan du gjør dette? Jeg synes jeg kan gjøre andre tre som ikke er perfekt balansert, men vet ikke hvordan du gjør det første.

Jeg setter pris på all hjelp !! Takk på forhånd!

Publisert på 30/09/2013 klokken 08:56
kilden bruker
På andre språk...                            


2 svar

stemmer
7

Sortere inngangslisten. Nå opprette et tre hvis rotnode er den midterste del av listen, og som har venstre og høyre undertrær er undertrærne som genereres ved å bruke denne fremgangsmåten til den underlister til venstre og høyre for midten, henholdsvis.

I 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))
Svarte 30/09/2013 kl. 09:06
kilden bruker

stemmer
0

Hvis toppen av treet må være midt element:

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'

Hvis ikke:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Svarte 01/10/2013 kl. 22:56
kilden bruker

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