Estratificación de un árbol
Los árboles se pueden representar mediante el siguiente tipo de datos
1 2 |
data Arbol a = N a [Arbol a] deriving Show |
Por ejemplo, los árboles
1 2 3 4 5 |
1 1 1 / \ / \ / \ 8 3 8 3 8 3 | /|\ /|\ | 4 4 5 6 4 5 6 7 |
se representan por
1 2 3 4 |
ej1, ej2, ej3 :: Arbol Int ej1 = N 1 [N 8 [],N 3 [N 4 []]] ej2 = N 1 [N 8 [], N 3 [N 4 [], N 5 [], N 6 []]] ej3 = N 1 [N 8 [N 4 [], N 5 [], N 6 []], N 3 [N 7 []]] |
Un estrato de un árbol es la lista de nodos que se encuentran al mismo nivel de profundidad. Por ejemplo, los estratos del árbol ej1 son [1], [8,3] y [4].
Definir la función
1 |
estratos :: Arbol a -> [[a]] |
tal que (estratos x) es la lista de los estratos del árbol x. Por ejemplo,
1 2 3 |
estratos ej1 == [[1],[8,3],[4]] estratos ej2 == [[1],[8,3],[4,5,6]] estratos ej3 == [[1],[8,3],[4,5,6,7]] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
data Arbol a = N a [Arbol a] deriving Show ej1, ej2, ej3 :: Arbol Int ej1 = N 1 [N 8 [],N 3 [N 4 []]] ej2 = N 1 [N 8 [], N 3 [N 4 [], N 5 [], N 6 []]] ej3 = N 1 [N 8 [N 4 [], N 5 [], N 6 []], N 3 [N 7 []]] estratos :: Arbol a -> [[a]] estratos x = takeWhile (not . null) [estrato n x | n <- [0..]] -- (estrato n x) es el estrato de nivel n del árbol x. Por ejemplo, -- estrato 0 ej1 == [1] -- estrato 1 ej1 == [8,3] -- estrato 2 ej1 == [4] -- estrato 4 ej1 == [] estrato :: Int -> Arbol a -> [a] estrato 0 (N x _) = [x] estrato n (N _ xs) = concatMap (estrato (n-1)) xs |
4 Comentarios