【问题标题】:Tree traversal with Haskell使用 Haskell 遍历树
【发布时间】:2018-01-21 21:00:33
【问题描述】:

大家好,这是我在这里的第一个问题,我对 Haskell 很陌生,我需要做一个 Haskell 函数,它接受一个树并在前序遍历中返回其节点中的元素列表,但我不能让它工作。

我的树定义如下:

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)

非常感谢您的帮助:)

【问题讨论】:

  • 好吧,你写了Node 只接受两个参数,但模式匹配三个。
  • 你有一个玫瑰树的数据定义,但是一个函数似乎需要一个二叉树。如果您希望 preorderTree 适用于您的 Tree 数据类型,请查看 concatMap
  • 这实际上不是您的第一个问题,因为您实际上并没有问任何问题。您也没有发布任何错误消息。鉴于遍历和数据声明不匹配,有两种可能的修复方法。哪个修复是正确的还不清楚,所以我投票关闭。随意编辑问题。

标签: haskell recursion tree


【解决方案1】:

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

所以写一个haskell函数。我们需要正确定义 type (Tree)。处理对应type中的每一个value(Empty, Node ...)。

Tree a 是一个类型。它的值要么是Empty,要么是一群孩子。因此我们有

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

所以当我们编写像preorderTree :: Tree a -> [a] 这样的函数时。我们正在处理 type Tree a,所以我们必须处理 value 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

【讨论】:

  • 非常感谢您的帮助,这对我很有帮助,而且我开始非常喜欢 Haskell :)
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多