Module OCaml:树函数

Module OCaml:树函数,module,ocaml,tree,Module,Ocaml,Tree,是否有处理树的模块或函数?我有这样一种类型: type t = Leaf of string (* todo: replace with 'a *) | Node of string * t list 我正在努力插入、移除子树等等 我用过谷歌,但找不到任何东西。阅读OCaml标准库源代码中模块集的实现。 它们是用二叉树实现的,只比你的复杂一点 (我建议您从二叉树开始,而不是像您定义的那样拥有一个子元素列表)实际上,这取决于您希望树工作的方式,例如,如果元素之

是否有处理树的模块或函数?我有这样一种类型:

    type t =
        Leaf of string (* todo: replace with 'a *)
      | Node of string * t list
我正在努力插入、移除子树等等


我用过谷歌,但找不到任何东西。

阅读OCaml标准库源代码中模块集的实现。 它们是用二叉树实现的,只比你的复杂一点


(我建议您从二叉树开始,而不是像您定义的那样拥有一个子元素列表)

实际上,这取决于您希望树工作的方式,例如,如果元素之间存在顺序等

否则,您可以使用树上的已知算法,例如,如果您知道如何在其他语言C或Java中使用它,我可以帮助您将其转换为OCAML。

过去,我使用过。 这不是一个简单的库,但如果您需要插入节点和更改路径,这可能就是诀窍,但我从未在b树上下文中使用过它

并从语言文档中摘录:

变体类型的最常见用法 是用来描述递归数据的 结构。例如,考虑 二叉树的类型:

这一定义如下: 包含类型为的值的二叉树 'a(任意类型)是 空,或者是包含一个节点的节点 “a”类型的值和两个子树 还包含“a”类型的值, 也就是说,一棵树两英尺

二叉树上的操作是 自然地表示为递归的 结构相同的函数 作为类型定义本身。对于 例如,下面是函数 在中执行查找和插入 有序二叉树(元素) 从左到右递增):

#让rec成员x b树=
配树
空->假
|节点(y、左、右)->
如果x=y,则为真,否则为真
如果x”a btree->bool=
#让rec插入x btree=
配树
空->节点(x,空,空)
|节点(y、左、右)->
如果x'a btree=

希望这能有所帮助。

我想Matt McDonnell的一个数据类型可以满足您的需要。

是的,但我用这些树来做句子语法,所以我不能只在其中输入值。他们需要维持秩序,我希望通过正确创建树来建立秩序,尽管我想我可以使用一个包装器类型,同时包含数字和单词本身……你可以通过正确创建树来建立秩序。实际上,模块集按顺序维护了树的元素(最左边的子代中最低的元素),所以我仍然认为它是一个很好的灵感来源。节点必须在某个地方定义吗?我看到您正在为insert中的节点使用某种构造函数,它是如何工作的,在哪里实现的?或者节点(x、左、右)只是模式匹配?如果是的话,你能再解释一下它的语法吗?谢谢,你的帖子很有帮助。除了@LB40的答案,这里还有:
#type 'a btree = Empty | Node of 'a * 'a btree * 'a btree;;
type 'a btree = Empty | Node of 'a * 'a btree * 'a btree
#let rec member x btree =
   match btree with
     Empty -> false
   | Node(y, left, right) ->
       if x = y then true else
       if x < y then member x left else member x right;;
val member : 'a -> 'a btree -> bool = <fun>

#let rec insert x btree =
   match btree with
     Empty -> Node(x, Empty, Empty)
   | Node(y, left, right) ->
       if x <= y then Node(y, insert x left, right)
                 else Node(y, left, insert x right);;
val insert : 'a -> 'a btree -> 'a btree = <fun>