我正在尝试使用展开功能来构建树。

Tree t = Leaf | Node (Tree t) t (Tree t)

unfoldT :: (b -> Maybe (b, a, b)) -> b -> Tree a
unfoldT f b =
    case f b of
      Nothing -> Leaf
      Just (lt, x, rt) -> Node (unfoldT f lt) x (unfoldT f rt)


构建功能需要创建一棵树,该树的高度等于提供的数字,并以有序方式编号。基本情况是构建0 =叶子,下一个是构建1 =节点(叶子0叶子)。

build :: Integer -> Tree Integer


我试图解决它:

build n = unfoldT (\x -> Just x) [0..2^n-2]


我不完全确定如何在此处构建树。
如果有人能指出我正确的方向,我会喜欢的。

编辑1:

如果我要使用2元组,那我应该合并什么?我需要能够以某种方式引用当前节点,其左侧子树和右侧子树,对吗?

最佳答案

如果我要使用2元组,那我应该合并什么?


我建议传递剩余的深度以及从左侧的偏移量:

build = unfoldT level . (0,)
  where
    level (_, 0) = Nothing
    level (o, n) = let mid = 2^(n-1)
                   in ((o, n-1), o+mid-1, (o+mid, n-1))

10-05 18:23