En Haskell, cómo generar un árbol de búsqueda binaria perfectamente equilibrado?

votos
3

La función debe toma una lista xs y construye un árbol binario de búsqueda equilibrado que consiste en exactamente el mismo conjunto de elementos como XS.

El resultado debe ser como este: (si la lista es [1,2,3,4,5,6,7,8])

Node (Nodo (Node (nodo vacío 1 vacía) 2 vacío) 4 (nodo vacío 4 Vacío)) 5 (Node (nodo vacío 6 Vacío) 7 (nodo vacío 8 Vacío))

es decir, el árbol debe tener este aspecto:

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

En vez de esto:

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

¿Podría alguien decirme cómo hacer esto? Me parece que puedo hacer el segundo árbol que no está perfectamente equilibrado, pero no saben cómo hacer el primero.

Agradezco cualquier ayuda !! ¡Gracias de antemano!

Publicado el 30/09/2013 a las 09:56
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
7

Ordenar la lista de entrada. Ahora cree un árbol cuyo nodo raíz es el elemento central de la lista, y cuyos subárboles izquierdo y derecho son las sub-estructuras generadas por la aplicación de este proceso a las sublistas a la izquierda ya la derecha del centro, respectivamente.

En 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))
Respondida el 30/09/2013 a las 10:06
fuente por usuario

votos
0

Si la parte superior del árbol debe ser el elemento central:

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'

Si no:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Respondida el 01/10/2013 a las 23:56
fuente por usuario

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