编写函数来计算树的左脊柱

时间:2012-02-07 01:37:15

标签: haskell

我需要一些帮助来弄清楚如何在Haskell中创建leftSpine函数。 基本上,它应该采取所有最左边的叶子并将它们放入列表中,但每当我运行我的代码时,我得到一个空列表。任何帮助将不胜感激。

这是我的代码。

data Tree x = Leaf | Node (Tree x) x (Tree x)
    deriving Show

leftSpine :: Tree x -> [x]
leftSpine Leaf  = []
leftSpine (Node lt x rt) = (leftSpine lt)

这是我的代码来测试它。

leftSpine (Node (Node (Node Leaf 1 Leaf) 2 (Node Leaf 3 Leaf))
                4
                (Node (Node Leaf 5 Leaf) 6 (Node Leaf 7 Leaf)))

它应该等于[4,2,1],但它只是[]

2 个答案:

答案 0 :(得分:6)

leftSpine :: Tree x -> [x]
leftSpine   Leaf  = []
leftSpine   (Node lt x rt) =  x:leftSpine lt

你实际上没有把任何东西放到列表中。区别在于x:leftSpine lt而不是leftSpine lt

答案 1 :(得分:2)

您的代码明确表示结果始终是空列表。

第一种情况说叶子的左脊柱是空列表。好到目前为止。

第二种情况说节点的左侧脊柱恰好是节点左侧子节点的左侧脊柱。

因此,如果我们想要找到树的左侧脊柱,我们将继续追踪我们到达的节点的左侧子节点,知道答案完全等于下一个左侧子节点的左侧脊柱。要么我们最终找到一个叶子,我们的结果是空列表,或者树是无限的,我们永远不会返回结果。您的代码中没有任何内容可以返回任何其他内容。


编写这种递归函数的关键是找出基本情况(Leaf,这里)的答案,然后是非基本情况(Node,在这里你需要弄清楚如何将子解决方案与本地信息结合起来,以生成完整的解决方案。

在这种情况下,Leaf的左侧脊柱很容易,因为根本没有数据。那么,您如何将Node lt x rtleftSpine lt的信息结合起来以获得整棵树的左侧脊柱?

相关问题