haskell - 从树中获取节点

标签 haskell recursion functional-programming

给定

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)

这段代码基本上是收集所有大于N的节点。

我明白,在基本情况下,我们正在查看特定的叶子并检查它是否大于 n,如果是,我们将添加到列表中,否则我们不会。但是我根本不理解解决方案的其他部分。有人可以帮我分解或尽可能简化吗?我真的很感激。

最佳答案

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

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

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

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

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

自然地,它不会永远递归,因为在我们收集子树时,我们会深入到由基本情况处理的Leaf节点。

关于haskell - 从树中获取节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26873264/

相关文章:

testing - Haskell:如何使用快速检查测试(响应式(Reactive))FSM?

haskell - Parsec 和自定义解析错误类型

powershell - 递归 PowerShell 函数无法调用自身

javascript - 删除数组递归调用模式中的项目?

Java 流 : Is there a cleaner way of doing this?

haskell - 解码霍夫曼树时出现非详尽模式错误?

postgresql - 使用 postgresql-simple 将 Postgres 间隔转换为 Haskell NominalTimeDiff

javascript - jQuery:递归过多且超出最大调用堆栈大小

python - 如何添加功能

sorting - 按功能编程语言排序