给定
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/