【问题标题】:how to make a tree from a given data with F#如何使用 F# 从给定数据创建树
【发布时间】:2011-04-13 10:16:06
【问题描述】:

有人可以教我如何使用 F# 从给定数据制作树吗?例如:数字列表或城市名称列表等。我不知道如何在 F# 中制作树,在这里需要帮助:)

例如: 输入来自运行时,假设它来自文本文件:城市列表名称

输出结果:图形

【问题讨论】:

  • 图是比树更通用的数据结构,所以问题更复杂。无论如何,如果您没有说明结果图/树中应连接哪些节点(例如城市),则无法回答该问题。

标签: f# tree


【解决方案1】:

维基百科有一个list 表示图形数据的常见方式,如果您尝试从文件加载图形数据,它应该可以帮助您。一旦你加载了数据search Stack Overflow。其中有很多关于树实现的问题。这里有一些。

【讨论】:

    【解决方案2】:

    一种可能的解决方案是使用Discriminated Unions 代表您的数据(在您的情况下为城市或数字)。问题是,您还需要知道您想要表达的城市之间的关系。

    例如您可以表达您的城市的“字母顺序”或“最近邻城市”或“按公民数量排序”的关系。正如您所说,您的输入只是城市名称列表,我假设您希望树按字母顺序排列您的城市(即表达“字母顺序”关系),在这种情况下,一种解决方案可能是:

    let cities = ["Munich"; "Rome"; "Florence"; "Berlin"; "Paris"; "Marseille"]
    
    type Tree<'A> =
    | Node of Tree<'A> * 'A * Tree<'A>
    | Leaf
    
    let rec insert tree element = 
        match element, tree with
        | x, Leaf                    -> Node(Leaf, x, Leaf)
        | x, Node(l,y,r) when x <= y -> Node((insert l x), y, r)
        | x, Node(l,y,r) when x >  y -> Node(l, y, (insert r x))
    
    let rec flatten = function
    | Leaf        -> []
    | Node(l,x,r) -> flatten l @ [x] @ flatten r
    
    let sort xs = xs |> List.fold insert Leaf
                     |> flatten
    
    
    let cityTree     = List.fold insert Leaf cities
    let sortedCities = sort cities
    

    【讨论】:

    • flatten函数的作用是什么?
    • flatten 将树转换回列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多