Haskell 从树中获取节点

Haskell 从树中获取节点,haskell,recursion,functional-programming,Haskell,Recursion,Functional Programming,给定 这段代码主要收集大于N的所有节点 我知道在基本情况下,我们正在查看一个特定的叶,检查它是否大于n,如果大于n,我们将其添加到列表中,否则我们不会。然而,我完全不理解解决方案的另一部分。有人能帮我把它分解一下,或者尽量简化一下吗?我非常感谢。解决方案的另一部分处理使用n调用collectnode和具有左树、值和右树的节点的情况。我们需要在左子树和右子树上递归执行collectnode,并且我们还需要包含此节点的值,当且仅当它大于n。有两种情况需要考虑: |n1>n=(collectnode

给定

这段代码主要收集大于N的所有节点


我知道在基本情况下,我们正在查看一个特定的叶,检查它是否大于n,如果大于n,我们将其添加到列表中,否则我们不会。然而,我完全不理解解决方案的另一部分。有人能帮我把它分解一下,或者尽量简化一下吗?我非常感谢。

解决方案的另一部分处理使用
n
调用
collectnode
和具有左树、值和右树的
节点的情况。我们需要在左子树和右子树上递归执行
collectnode
,并且我们还需要包含此
节点的值,当且仅当它大于
n
。有两种情况需要考虑:

|n1>n=(collectnode n tr1)+[n1]+(collectnode n tr2)

在本例中,
n1>n
因此我们希望包括递归收集左子树产生的所有结果、当前节点的值以及递归收集右子树产生的所有结果

|否则=(collectnode n tr1)++(collectnode n tr2)

在这种情况下,不应包括来自当前节点的值,因此我们只收集来自左子树和右子树的值。结果是两者的串联


自然,它不会永远递归,因为在收集子树的某个时候,我们会深入到由基本大小写处理的
节点。

似乎有输入错误
collectnode n(Node t1 n t2)
应为
collectnode n(Node t1 n1 t2)
,但实际上,如果在这种情况下也使用
x
,而不是
n1
,我会发现它会更清楚。而且,似乎是
collectnode
类型中的打字错误。看看它的用法,它一定是
collectnode::Int->Tree->[Int]
。标识符没有正确使用<代码>收集节点n(节点tr1 n1 tr2)
data Tree = Leaf Int | Node Tree Int Tree

collectnode :: Int -> [Tree] -> [Int]

collectnode n (Leaf x)
            |x > n = [x]
            |otherwise = []
collectnode n (Node t1 n t2)
            |n1 > n = (collectnode n tr1) ++ [n1] ++ (collectnode n tr2)
            |otherwise = (collectnode n tr1) ++ (collectnode n tr2)