+-- Exercise 3
+build :: [LogMessage] -> MessageTree
+build = foldr (\msg t -> insert msg t) Leaf
+
+-- Exercise 4
+inOrder :: MessageTree -> [LogMessage]
+inOrder (Leaf) = []
+inOrder (Node lt rootmsg rt) = inOrder lt ++ [rootmsg] ++ inOrder rt
+
+-- Exercise 5
+whatWentWrong :: [LogMessage] -> [String]
+whatWentWrong ls = let sortedLogMsgs = inOrder (build ls)
+ in
+ filterErrorMessages (>= 50) sortedLogMsgs
+ where
+ filterErrorMessages _ [] = [""]
+ filterErrorMessages f ((LogMessage (Error level) _ s):ms) | f level = s: filterErrorMessages f ms
+ | otherwise = filterErrorMessages f ms
+ filterErrorMessages f (_:ms) = filterErrorMessages f ms