【问题标题】:flatten a tree with a list of subtrees in Haskell用 Haskell 中的子树列表展平一棵树
【发布时间】: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 的用例来说是有意义的——例如,在他们的示例中,同一级别应该有三个“顶级”节点。在任何情况下,类型肯定可以简化——通过一些调整,来自 containersData.Tree 就可以了。
  • (@homior 解释得更好一点:可以省略Leaf 构造函数(使用Forks 和一个空的树列表)和Root 一个(使permute 的结果是一个树列表)。然后,您的 Tree 将等同于来自 Data.Tree 的结果。)

标签: haskell permutation multiway-tree


【解决方案1】:

我的方法是深度优先搜索。

data Tree a =  Leaf a          
            | Fork a [Tree a]       
            | Root [Tree a]         
            deriving(Show)

dfs :: Tree a -> [[a]]
dfs (Root ts) = concatMap dfs ts
dfs (Fork v ts) = map (v:) (concatMap dfs ts) 
dfs (Leaf v) = [[v]]

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2020-02-05
    • 2015-12-20
    相关资源
    最近更新 更多