It’s surprising that DFS and BFS appear so often, so an example to illustrate both. The key for DFS is to maintain a stack to resume the search, while
BFS feels more natural with the help of concatMap
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 {-# LANGUAGE RecordWildCards #-} data BTree = Leaf Int | BTree { left :: BTree , right :: BTree } deriving (Show ) dfs :: BTree -> [Int ]dfs tree = loop [] [tree] where loop acc [] = reverse acc loop acc ((Leaf v):rest) = loop (v:acc) rest loop acc (BTree {..}:rest) = loop acc (left:right:rest) bfs :: BTree -> [Int ]bfs tree = loop [] [tree] where to_leaf (Leaf v) = [v] to_leaf _ = [] to_subtree BTree {..} = [left, right] to_subtree _ = [] loop acc [] = acc loop acc level = loop (acc ++ (concatMap to_leaf level)) (concatMap to_subtree level) tree = BTree { left = BTree { left = Leaf 1 , right = Leaf 10 }, right = Leaf 3 } main = do print $ dfs tree print $ bfs tree