1

我想展平一棵看起来像这样的树:

> 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来将字符串的所有可能排列可视化为树。但我不知道如何把这种树弄平。谢谢你的帮助。

4

1 回答 1

4

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

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]]
于 2018-02-26T18:47:25.900 回答