从树中获取节点

时间:2014-11-11 19:50:15

标签: 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,如果它是我们添加到列表,否则我们不会。但是我根本不理解解决方案的其他部分。有人可以请我为我分解或尽可能地简化它吗?我真的很感激。

1 个答案:

答案 0 :(得分:2)

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

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

在这种情况下,n1 > n所以我们希望包括递归收集左子树产生的所有结果,当前节点的值以及递归收集右子树产生的所有结果。

|otherwise = (collectnode n tr1) ++ (collectnode n tr2)

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

它自然不会永远递归,因为在某些时候,当我们收集子树时,我们会到达由基本情况处理的Leaf个节点。

相关问题