В прошлом я использовал 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 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>
Надеется, что это помогает
Да, но я использую эти деревья для синтаксиса предложения, поэтому я не могу просто бросать значения там. они должны поддерживать порядок, и я надеялся установить этот порядок, просто создав дерево должным образом, хотя, я думаю, я мог бы использовать тип обертки как с номером, так и с самим словом ... –
Вы * можете * установить порядок правильно создавая дерево. На самом деле модуль Set поддерживает элементы дерева по порядку (самый нижний элемент у самого левого потомка), поэтому я все еще думаю, что это хороший источник вдохновения. –