Haskell:深度优先搜索有序树

时间:2015-10-01 13:53:27

标签: haskell tree depth-first-search

首先,我有一个有序树的数据类型:

dfsTreeList :: OrdTree a ->  [a]                       
dfsTreeList (OrdTree a (x:xt)) = a : (dfsTreeList x) ++ (dfsTreeList (OrdTree a xt))                          
dfsTreeList (OrdTree a []) = a : [] 

我需要按照DFS(深度优先搜索)的顺序获取所有节点的列表。

我试图解决这个问题:

dfsTreeList (OrdTree 7 [(OrdTree 3 [(OrdTree 1 []), (OrdTree 4 [])]), (OrdTree 10 [(OrdTree 8 []), (OrdTree 12 [])])])

但是出现了一个新问题:每个非最后一个节点都包含在列表中两次。

例如,输入数据:

[7,3,1,3,4,3,7,10,8,10,12,10,7]

结果:

C                   MOVEL     TEST          TESTFELD 

有人有什么想法吗?谢谢你的回复。

1 个答案:

答案 0 :(得分:3)

下面

puzzleArray = new char[numRows][numRows];

您正在复制dfsTreeList (OrdTree a (x:xt)) = a : (dfsTreeList x) ++ (dfsTreeList (OrdTree a xt)) 。您可以尝试将该函数应用于列表中的每个子树,例如

a

您也可以使用dfsTreeList (OrdTree a xs) = a : concat (map dfsTreeList xs) concatMap来达到同样的效果。