W Haskell, jak wygenerować doskonale zrównoważony binarne drzewo poszukiwań?

głosy
3

Funkcja powinna pobiera listę xs i konstruuje wyważone drzewo binarne wyszukiwania składają się dokładnie tego samego zestawu elementów jak xs.

Wynik powinien być w ten sposób (jeśli lista [1,2,3,4,5,6,7,8])

Węzła (węzłów (węzeł (node ​​Puste jeden pusty) 2 pusty) 4 (węzeł pusty 4 pusty)) 5 (węzeł (node ​​Puste 6 pusty) 7 (węzeł pusty 8 pusty))

to znaczy drzewo powinno wyglądać tak:

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

zamiast tego:

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

Czy ktoś może mi powiedzieć jak to zrobić? Uważam mogę zrobić drugiego drzewa, który nie jest doskonale wyważone, ale nie wiem jak to zrobić pierwszy.

Doceniam jakiejkolwiek pomocy !! Z góry dziękuję!

Utwórz 30/09/2013 o 09:56
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
7

Posortować listę wejściową. Teraz utworzyć drzewo, którego korzeniem jest węzeł środkowy element z listy, a którego lewa i prawa poddrzewa są poddrzewa generowane przez zastosowanie tego procesu do podlist na lewo i prawo od środka, odpowiednio.

W 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))
Odpowiedział 30/09/2013 o 10:06
źródło użytkownik

głosy
0

Jeśli wierzchołek drzewa musi być element środkowy:

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'

Jeśli nie:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Odpowiedział 01/10/2013 o 23:56
źródło użytkownik

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