Haskell中树数据结构的邻接列表

学徒

我在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

但是现在我陷入了如何递归打印孩子的问题。特别是如何给子节点编号?

埃里克

我想出了以下解决方案:

import Data.List (foldl')

enum :: Int -> Trie -> ([(Int,Int,Char)],Int)
enum x Leaf = ([],x+1)
enum x (Node pairs)
  = let go (acc,y) (c,t) = (acc',y')
          where acc' = [(x,y,c)] ++ edges ++ acc
                (edges,y') = enum y t
    in foldl' go ([],x+1) pairs

enum接受起始ID和a,Trie并返回边列表和下一个可用ID。

-- some examples:

leafs xs = [ (c,Leaf) | c <- xs ]
t1 = Node $ leafs "XYZ"
t2 = Node [('W', t1)]
t3 = Node $ [('A',t2)] ++ leafs "BC"

enum 1 t1 -- ([(1,4,'Z'),(1,3,'Y'),(1,2,'X')],5)
enum 1 t2 -- ([(1,2,'W'),(2,5,'Z'),(2,4,'Y'),(2,3,'X')],6)
enum 1 t3 -- ([(1,8,'C'),(1,7,'B'),(1,2,'A'),(2,3,'W'),(3,6,'Z'),(3,5,'Y'),(3,4,'X')],9)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中删除树(数据结构)

来自分类Dev

Julia中的树数据结构

来自分类Dev

在Haskell中编译大数据结构

来自分类Dev

Haskell中的复杂数据结构

来自分类Dev

Haskell中的数据结构混乱

来自分类Dev

在Haskell中编译大数据结构

来自分类Dev

数据结构集,列表,地图还是树?

来自分类Dev

树数据结构的性质

来自分类Dev

python中的事件列表数据结构

来自分类Dev

转换数据结构中的列表

来自分类Dev

在树数据结构中添加节点时递归

来自分类Dev

Haskell通用数据结构

来自分类Dev

Haskell中逻辑表达式的数据结构

来自分类Dev

Haskell在数据结构中存储功能-用例

来自分类Dev

Haskell在数据结构中存储功能-用例

来自分类Dev

使用数据结构在haskell中漂亮地打印

来自分类Dev

如何创建B +树数据结构

来自分类Dev

表达式树数据结构

来自分类Dev

区间范围树数据结构C ++

来自分类Dev

硒离子数据结构树展开

来自分类Dev

重组树的数据结构:父母是排列

来自分类Dev

从R中的列表制作数据结构

来自分类Dev

C中的数据结构-在列表的开头插入节点

来自分类Dev

应用中的可修改列表使用什么数据结构?

来自分类Dev

数据结构:如果堆是树,为什么在内部用列表或数组实现它们?

来自分类Dev

数据结构:如果堆是树,为什么在内部用列表或数组实现它们?

来自分类Dev

邻接表和邻接矩阵能够在逻辑上表示非线性数据结构

来自分类Dev

将树数据结构存储在数据库中

来自分类Dev

列表和子列表数据结构