【发布时间】:2018-02-26 18:22:00
【问题描述】:
我想把一棵看起来像这样的树弄平:
> data Tree a = Leaf a
> | Fork a [Tree a]
> | Root [Tree a]
可能的例子:
Root [Fork 'a' [Fork 'b' [Leaf 'c'],Fork 'c' [Leaf 'b']],Fork 'b' [Fork 'a' [Leaf 'c'],Fork 'c' [Leaf 'a']],Fork 'c' [Fork 'a' [Leaf 'b'],Fork 'b' [Leaf 'a']]]
应该变成
["abc","acb","bac","bca","cab","cba"]
解释原因:
我尝试构建一种排列树。我编写了一个函数permute :: String -> Tree Char 来将字符串的所有可能排列可视化为一棵树。但我不知道如何把这种树弄平。
谢谢你的帮助。
【问题讨论】:
-
Root 与 Fork 不同的任何特殊原因?通常你只会有 Fork 和 Leaf,因为 Root 只是这里不符合惯例的根。
-
@HTNW 这对于 OP 的用例来说是有意义的——例如,在他们的示例中,同一级别应该有三个“顶级”节点。在任何情况下,类型肯定可以简化——通过一些调整,来自 containers 的
Data.Tree就可以了。 -
(@homior 解释得更好一点:可以省略
Leaf构造函数(使用Forks 和一个空的树列表)和Root一个(使permute的结果是一个树列表)。然后,您的Tree将等同于来自Data.Tree的结果。)
标签: haskell permutation multiway-tree