树遍历与Haskell

时间:2017-08-14 04:24:23

标签: haskell recursion tree

大家好,这是我的第一个问题,我对Haskell很新,我需要做一个Haskell函数,它接受一个Tree并在前序遍历中返回其节点中的元素列表但是我可以& #39;让它发挥作用。

我的树定义如下:

data Tree a = Node a [Tree a] deriving Show

,预订功能是:

preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a l r) = a : (preorderTree l) ++ (preorderTree r)

事先感谢你的帮助:)

1 个答案:

答案 0 :(得分:2)

在Haskell中,类型是一组。所以我们有类型构造函数和值构造函数。

所以写一个haskell函数。我们需要正确定义类型Tree)。在相应的类型中处理每个EmptyNode ...)。

Tree a类型。它的值是Empty或一堆孩子。因此我们有

data Tree a = Empty
            | Node a [Tree a]

所以当我们编写像preorderTree :: Tree a -> [a]这样的函数时。我们正在处理类型 Tree a,因此我们必须处理值EmptyNode a [Tree a]。所以我们有

preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a children) = a : concatMap preorderTree children

这是一棵玫瑰树,如果你只想要一棵二叉树,我们需要更改Tree a类型的值构造函数,因为[Tree a]对于二叉树来说太多了。所以我们有

data Tree a = Empty
            | Node a (Tree a) (Tree a)

preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a left right) = a : preorderTree left ++ preorderTree right
  1. https://wiki.haskell.org/Constructor