import Data.Tree (Tree (Node), levels)
import Data.Maybe (isNothing, fromJust, listToMaybe)
ej1, ej2 :: Tree Int
ej1 = Node 1 [Node 6 [],Node 3 [Node 1 []]]
ej2 = Node 3 [Node 5 [Node 3 []], Node 4 [], Node 7 [Node 6 [], Node 5 []]]
-- 1ª definición
minimaProfundidad1 :: Ord a => a -> Tree a -> Maybe Int
minimaProfundidad1 x (Node y ns)
| x == y = Just 0
| null zs = Nothing
| otherwise = Just (1 + minimum zs)
where zs = [z | Just z <- filter (/=Nothing) (map (minimaProfundidad1 x) ns)]
-- 2ª definición
minimaProfundidad2 :: Ord a => a -> Tree a -> Maybe Int
minimaProfundidad2 x (Node y ns)
| x == y = Just 0
| z == Nothing = Nothing
| otherwise = Just (1 + fromJust z)
where z = minimum (map (minimaProfundidad2 x) ns)
-- 3ª definición
minimaProfundidad3 :: Ord a => a -> Tree a -> Maybe Int
minimaProfundidad3 x (Node y ns)
| x == y = Just 0
| otherwise = Just (+1) <*> minimum (map (minimaProfundidad3 x) ns)
-- 4ª definición
minimaProfundidad4 :: Ord a => a -> Tree a -> Maybe Int
minimaProfundidad4 x ns
| null zs = Nothing
| otherwise = Just (head zs)
where zs = [z | (z,ys) <- zip [0..] (levels ns), x `elem` ys]
-- 5ª definición
minimaProfundidad5 :: Ord a => a -> Tree a -> Maybe Int
minimaProfundidad5 x ns =
listToMaybe [z | (z,ys) <- zip [0..] (levels ns), x `elem` ys]