【发布时间】:2014-07-10 23:49:37
【问题描述】:
我在 Haskell 中定义了以下抽象数据类型:
data Trie = Leaf
| Node [(Char, Trie)]
deriving (Eq)
Node 类型是元素列表(c, t),其中c 是从当前节点到t 的边的标签。
现在我想打印出树的邻接列表。具体来说,我需要每行打印一条边,其中一条边的格式为:
n1 n2 c
n1 是源,n2 是目标,c 是边缘的标签。
我可以从我的根节点打印边缘
instance Show Trie where
show = show' 2 1
where show' _ _ Leaf = ""
show' next n1 (Node ts) = unlines $ zipWith (\n2 (c, _) ->
show n1 ++ " " ++ show n2 ++ " " ++ show c)
[next..] ts
但现在我不知道如何递归打印孩子。具体来说,如何给子节点编号?
【问题讨论】:
-
您是否希望为每个节点分配特定的顺序,或者您只想为每个节点分配一个唯一编号?我建议将您的数据类型写为
data Trie a = Leaf | Node [(a, Trie)],这样可以轻松编写Trie a -> Trie (a, Int)类型的函数 -
@user2407038 根节点需要编号为1。其余的顺序无所谓,只要每个节点都有唯一的编号即可。
-
@user2407038 我在讨论写
number :: Trie a -> Trie (a, Int)时,深度优先还是广度优先更容易。 -
@user2407038:只是在这种情况下,您需要对 edges 进行编号,而不是对 nodes 进行编号。
标签: haskell