我完全迷失了如何在Haskell中进行树转换。我需要从定义为:
的玫瑰树开始data Rose a = Node a [Rose a] deriving (Eq, Show, Ord)
到二进制树,定义为:
data Btree a = Empty | Fork a (Btree a) (Btree a) deriving (Eq, Show, Ord)
在我的课堂上,我获得了一个类似的功能,但是使用了不同的二叉树定义。对于该函数,玫瑰树定义相同,二叉树定义为:
Btree a = Leaf a | Fork (Btree a) (Btree a)
使用从玫瑰树到二叉树的函数定义为:
toB :: Rose a -> Btree a
toB (Node x xts) = foldl Fork (Leaf x) (map toB xts)
toB (Node x []) = foldl Fork (Leaf x) []
我有答案,但我不知道如何转换它,以便它适用于Btree
的新定义。
答案 0 :(得分:1)
当我做这样的事情时,我认为“左”子树是第一个孩子,而“右”子树是节点的兄弟姐妹。这意味着您可以像这样转换树:
h h
/|\ /
/ | \ /
b d e ==> b->d->e
/ \ / \ / /
a c f g a->c f->g
h
仍然是根,但在第二个图中,/
是左子树,->
是右。叶子没有左子树,但可能有兄弟姐妹(右子树)。根没有正确的子树,但可能有子节点(左子树)。内部节点都有。
这有帮助吗?
答案 1 :(得分:1)
尝试编写从二叉树的第一个定义转换为第二个定义的函数。然后转发。 toB是你的新功能!现在,系统地创建一个新功能,直接作为两者的融合,通过将一个内联到另一个,您将获得一个简单而优雅的解决方案。