List 如何返回树&x27;s在Haskell的列表中留下

List 如何返回树&x27;s在Haskell的列表中留下,list,haskell,tree,binary-tree,List,Haskell,Tree,Binary Tree,到目前为止,我有以下代码: data BinaryTree a = Null | Node a (BinaryTree a) (BinaryTree a) treeLeaves :: BinaryTree a -> [a] treeLeaves tree = case tree of Null -> [] Node v t1 t2 -> [] ++ treeLeaves t1 ++ treeLeaves t2 我不确定我做错了什么。它输出一

到目前为止,我有以下代码:

data BinaryTree a  = Null | Node a (BinaryTree a) (BinaryTree a)

treeLeaves :: BinaryTree a -> [a]
treeLeaves tree = case tree of
    Null         -> []
    Node v t1 t2 -> [] ++ treeLeaves t1 ++ treeLeaves t2

我不确定我做错了什么。它输出一个空列表。

现在,您缺少一个重要步骤,即将叶子添加到列表中,这就是为什么您总是得到一个空列表。此
[]++treeLeaves t1++treeLeaves t2
最终将落在
Null
分支中,并成为
[]+[]++…++[]
正如泽塔所评论的那样

BinaryTree
Node v Null Null
时,您就知道已经到达了一个叶子。因此,您也需要为这种情况编写一个分支:

treeLeaves :: BinaryTree a -> [a]
treeLeaves tree = case tree of
    Null             -> []
    Node v Null Null -> v:[]
    Node _ t1 t2     -> treeLeaves t1 ++ treeLeaves t2

正如Igor所评论的,您可以在最后一行使用
\uu
而不是
v
,因为您没有在该节点中使用元素(因为它不是叶)

现在你错过了重要的一步,那就是将叶子添加到列表中,这就是为什么你总是得到一个空列表。此
[]++treeLeaves t1++treeLeaves t2
最终将落在
Null
分支中,并成为
[]+[]++…++[]
正如泽塔所评论的那样

BinaryTree
Node v Null Null
时,您就知道已经到达了一个叶子。因此,您也需要为这种情况编写一个分支:

treeLeaves :: BinaryTree a -> [a]
treeLeaves tree = case tree of
    Null             -> []
    Node v Null Null -> v:[]
    Node _ t1 t2     -> treeLeaves t1 ++ treeLeaves t2

正如Igor所评论的,您可以在最后一行使用
\uu
而不是
v
,因为您没有在该节点中使用元素(因为它不是叶)

在用Haskell写这篇文章之前,请先解释一下你自己会怎么做?您希望程序采取什么步骤返回叶子?
[]++x++y
x++y
。在什么时候
treeLeaves
将返回除
[]
之外的其他内容?
v
节点v t1 t2中的
v参数未在实现中使用。嗯,也许我们可以用它做点什么,或者用
\uuuu
来代替,不要分心…在用Haskell写之前,请先解释一下你自己会怎么做?您希望程序采取什么步骤返回叶子?
[]++x++y
x++y
。在什么时候
treeLeaves
将返回除
[]
之外的其他内容?
v
节点v t1 t2
中的
v参数未在实现中使用。嗯,也许我们可以用它做点什么,或者使用
\uuuu
来避免分心。。。