我有一个类似的问题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.
答案 0 :(得分:1)
让我们尝试从原始树中获取元素(2,3)[Level 2,Element#3作为对此处使用的坐标的解释]。
0
/ \
0 1
/ \ / \
0 1 2 3
现在这与从子树中获取元素(1,1)相同(这很简单!)
1
/ \
2 3
现在想一个具有一个级别的树的示例。做递归技巧。
答案 1 :(得分:0)
您认为自己撰写fromroot
以Tree a
作为第三个参数,但您已将其写为Tree [a]
。
这是因为您使用x
作为列表,而不是将其添加到递归调用返回的列表中。
要将单个元素添加到列表中,请使用:
。 ++
用于将两个列表连接在一起。
(我也认为你的if条件应该是0 /= (j `div` (2^(i-1)))
而不是j div (2^(i-1))
,因为(1)使用命名函数作为运算符,它们必须用反引号括起来,并且(2){{1需要一个if
,而不会从Bool
转换为你。但这不是你发布的错误信息所抱怨的。)
可能还有其他错误;我没有检查过。