A Haskell, hogyan kell létrehozni egy tökéletesen kiegyensúlyozott bináris keresési fa?

szavazat
3

A funkció azt egy listát xs és felépíti a kiegyensúlyozott bináris keresési fa álló pontosan ugyanazokat a elemek xs.

Az eredmény a következő: (ha a lista [1,2,3,4,5,6,7,8oktafluor])

Csomópont (Node (csomópont (Node Üres 1 Üres) 2 Üres) 4 (Node Üres 4 Üres)) 5 (Csomópont (Node Üres 6 Üres) 7 (Node Üres 8 Üres))

vagyis a fa így kell kinéznie:

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

helyett ezt:

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

Lehet valaki mondani nekem, hogyan kell ezt csinálni? Találom meg tudom csinálni a második fát, mely nem teljesen kiegyenlített, de nem tudom, hogyan kell csinálni az elsőt.

Nagyra értékelem minden segítséget !! Előre is köszönöm!

A kérdést 30/09/2013 09:56
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
7

Rendezés a bemeneti listában. Most hozzon létre egy fa, amelynek gyökér csomópont közepén eleme a listában, amelynek a bal és a jobb részfák a részfákat állítjuk elő, hogy ez a folyamat a sublists balra és jobbra a központ, ill.

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))
Válaszolt 30/09/2013 10:06
a forrás felhasználó

szavazat
0

Ha a fa tetején kell lennie a középső elem:

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'

Ha nem:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Válaszolt 01/10/2013 23:56
a forrás felhasználó

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