Haskell:从每个叶子节点获取到root的路径

时间:2011-12-27 17:42:56

标签: haskell tree root

我有一个类似的问题Haskell: Get path from every leaf node to root in a Bin tree structure。没有答案。

(寻找方式)。 coords(2,2) - > [2,1,0] 我有树,每个级别从0开始。

   0
  / \
 0   1
/ \ / \
0 1 2 3
........

我写了一些代码,但它不起作用(cource ...)

fromroot 0 _ _ = []
fromroot i j (Node t1 x t2)
   = if (j div (2^(i-1)))
        then x++ (fromroot (i-1) (j-2^(i-1)) t2)
        else x++ (fromroot (i-1) j t1)

tree我从那里开始。

data Tree a = Node (Tree a) a (Tree a)

myBuild :: Int  -> Tree Int
myBuild n = (Node (myBuild (n*2)) n (myBuild (n*2+1)))

希望,你会帮助我。

UPD 1

输入> fromroot 3 2 (myBuild 0)myBuild函数的错误。

    Couldn't match expected type `[a0]' with actual type `Int'
    Expected type: Tree [a0]
      Actual type: Tree Int
    In the return type of a call of `myBuild'
    In the third argument of `fromroot', namely `(myBuild 0)'
Failed, modules loaded: none.

2 个答案:

答案 0 :(得分:1)

提示

让我们尝试从原始树中获取元素(2,3)[Level 2,Element#3作为对此处使用的坐标的解释]。

   0
  / \
 0   1
/ \ / \
0 1 2 3

现在这与从子树中获取元素(1,1)相同(这很简单!)

 1
/ \
2 3

现在想一个具有一个级别的树的示例。做递归技巧。

答案 1 :(得分:0)

您认为自己撰写fromrootTree a作为第三个参数,但您已将其写为Tree [a]

这是因为您使用x作为列表,而不是将其添加到递归调用返回的列表中。

要将单个元素添加到列表中,请使用:++用于将两个列表连接在一起。

(我也认为你的if条件应该是0 /= (j `div` (2^(i-1)))而不是j div (2^(i-1)),因为(1)使用命名函数作为运算符,它们必须用反引号括起来,并且(2){{1需要一个if,而不会从Bool转换为你。但这不是你发布的错误信息所抱怨的。)

可能还有其他错误;我没有检查过。