将玫瑰树转换为不同的二叉树类型

时间:2010-11-01 21:12:47

标签: haskell tree functional-programming

我完全迷失了如何在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的新定义。

2 个答案:

答案 0 :(得分:1)

当我做这样的事情时,我认为“左”子树是第一个孩子,而“右”子树是节点的兄弟姐妹。这意味着您可以像这样转换树:

     h                 h
    /|\               /
   / | \             /
  b  d  e     ==>   b->d->e
 / \   / \         /     /
a   c f   g       a->c  f->g

h仍然是根,但在第二个图中,/是左子树,->是右。叶子没有左子树,但可能有兄弟姐妹(右子树)。根没有正确的子树,但可能有子节点(左子树)。内部节点都有。

这有帮助吗?

答案 1 :(得分:1)

尝试编写从二叉树的第一个定义转换为第二个定义的函数。然后转发。 toB是你的新功能!现在,系统地创建一个新功能,直接作为两者的融合,通过将一个内联到另一个,您将获得一个简单而优雅的解决方案。