Árboles binarios completos
Un árbol binario completo es un árbol en el que cada nodo tiene cero o dos hijos. Por ejemplo, el primero de los siguientes árboles es un árbol binario completo pero los otros no lo son
1 1 1 / \ / \ / | \ 2 3 2 3 2 7 3 / \ / / \ 4 5 4 4 5
Los árboles se pueden representar mediante el siguiente tipo de datos
data Arbol a = N a [Arbol a] deriving Show
Por ejemplo, los árboles los árboles anteriores se puede representar por
ej1, ej2, ej3 :: Arbol Int ej1 = N 1 [N 2 [N 4 [], N 5 []], N 3 []] ej2 = N 1 [N 2 [N 4 []], N 3 []] ej3 = N 1 [N 2 [N 4 [], N 5 []], N 7 [], N 3 []]
Definir la función
esBinarioCompleto :: Arbol t -> Bool
tal que (esBinarioCompleto a) se verifica si a es un árbol binario completo. Por ejemplo,
esBinarioCompleto ej1 == True esBinarioCompleto ej2 == False esBinarioCompleto ej3 == False
Soluciones
data Arbol a = N a [Arbol a] deriving Show ej1, ej2, ej3 :: Arbol Int ej1 = N 1 [N 2 [N 4 [], N 5 []], N 3 []] ej2 = N 1 [N 2 [N 4 []], N 3 []] ej3 = N 1 [N 2 [N 4 [], N 5 []], N 7 [], N 3 []] esBinarioCompleto :: Arbol t -> Bool esBinarioCompleto (N _ []) = True esBinarioCompleto (N x as) = length as `elem` [0,2] && all esBinarioCompleto as