V Haskell, jak generovat dokonale vyvážený strom binárního vyhledávání?

hlasů
3

Funkce by měla vezme seznam xs a buduje vyvážený binární vyhledávací strom se skládá z přesně stejným souborem prvků jako xs.

Výsledek by měl vypadat takto: (pokud je seznam [1,2,3,4,5,6,7,8])

Uzel (Node (uzel (Uzel prázdný 1 prázdný) 2 prázdný) 4 (uzlu prázdný 4 prázdný)) 5 (uzel (node ​​Prázdné 6 prázdný) 7 (uzel prázdný 8 prázdný))

to znamená, že strom by měl vypadat takto:

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

spíše než to:

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

Mohl by mi někdo říct, jak to udělat? Zjistil jsem, co můžu udělat druhý strom, který není dokonale vyrovnaná, ale nevím, jak to udělat ten první.

Oceňuji jakoukoliv pomoc !! Děkuji předem!

Položena 30/09/2013 v 09:56
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
7

Seřazení seznamu vstupu. Nyní vytvořte strom, jehož kořenový uzel je prostřední prvek seznamu, a jehož levá a pravá podstromy jsou podstromy generované použitím tohoto procesu na sublists vlevo a vpravo od středu, resp.

V 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))
Odpovězeno 30/09/2013 v 10:06
zdroj uživatelem

hlasů
0

V případě, že vrchol stromu musí být prostřední 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'

Pokud ne:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Odpovězeno 01/10/2013 v 23:56
zdroj uživatelem

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