Heres сценарий, чтобы сделать это И подсказки для интеграции сценария из Проводника
http://www.ibm.com/developerworks/rational/library/4687.html
Прочтите реализацию модуля Set в исходных кодах стандартной библиотеки OCaml. Они реализованы с помощью двоичных деревьев, только немного более сложных, чем ваше.
(Я бы рекомендовал вам начать с двоичных деревьев, а не иметь список дочерних элементов, как вы, кажется, определили)
На самом деле это зависит от того, как вы хотите, чтобы ваше дерево работало, например, есть ли порядок между элементами и тому подобное.
В противном случае вы можете использовать известные алгоритмы для деревьев, если у вас есть идея, как это сделать на других языках C или Java, например, я могу помочь перевести его на OCAML.
Раньше я использовал окамлграф . Это нетривиальная библиотека для использования, но если вам нужно вставить узлы и изменить путь, это может помочь, я никогда не использовал это в контексте 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 и два поддерева содержащие также значения типа '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>
Надеюсь, это поможет