在二叉树中搜索元素

时间:2017-11-30 12:51:45

标签: haskell functional-programming

我们有这棵树:

data Bintree a = Empty | Fork a (Bintree a) (Bintree a) deriving Show
data Edge = Left | Right deriving Show
type Node = [Edge]

我应该在其中搜索一个元素。如果我找到它,我会返回Just Node。如果没有,我什么都没回来。树没有订购。

search :: Eq a => a -> Bintree a -> Maybe Node

搜索功能应该如下所示。

1 个答案:

答案 0 :(得分:3)

search :: Eq a => a -> Bintree a -> Maybe [Edge]
search a Empty = Nothing
search a (Fork b lt rt) = (guard (a==b) >> pure [])
                        <|> (Left  :) <$> search a lt
                        <|> (Right :) <$> search a rt

应该做的伎俩。执行左偏置深度优先搜索,将路径返回到第一个匹配值(如果有)。

这使用Just作为Functor,作为Alternativeative,Monad和MonadPlus,使用数据类型编码的行为来避免我们自己编写一些平凡的代码。