簡體   English   中英

OCaml:樹函數

[英]OCaml: Tree functions

有沒有處理樹的模塊或函數? 我有一個看起來像這樣的類型:

type t =
  Leaf of string (* todo: replace with 'a *)
| Node of string * t list

我正在努力進行插入、刪除子樹等操作。

我用過谷歌但找不到任何東西。

在OCaml標准庫的源代碼中閱讀模塊Set的實現。 它們是用二進制樹實現的,僅比您的復雜得多。

(我建議您從二叉樹開始,而不要像您定義的那樣列出子列表)

過去,我使用ocamlgraph 這不是一個普通的庫,但是如果您需要插入節點並更改路徑,那可能會成功,但是我從來沒有在b樹上下文中使用它。

並從語言文檔中提取:

變量類型最常見的用法是描述遞歸數據結構。 考慮一下例如二叉樹的類型:

#type 'a btree = Empty | Node of 'a * 'a btree * 'a btree;;
type 'a btree = Empty | Node of 'a * 'a btree * 'a btree

該定義如下:包含類型為'a(任意類型)的值的二叉樹要么為空,要么為節點,包含一個類型為'a的值,以及兩個子樹也包含類型為'a的值,即兩個'一棵樹。

對二叉樹的操作自然地表示為遞歸函數,遵循與類型定義本身相同的結構。 例如,以下是在有序二叉樹中執行查找和插入的函數(元素從左到右增加):

#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>

希望這可以幫助

實際上,這取決於您希望樹的工作方式,例如,元素之間的順序等。

否則,您可以在樹上使用已知的算法,例如,如果您有一個如何使用其他語言C或Java的想法,我可以幫助將其翻譯為OCAML。

我認為,Matt McDonnell有一個Ptree數據類型可以滿足您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM