W przeszłości używałem ocamlgraph. To nie jest trywialne lib w użyciu, ale jeśli trzeba wstawić węzły i zmienić ścieżkę, które mogłyby trick, nigdy nie używany, że w kontekście b drzewa mimo ...
i wyodrębnionego z dokumentacja język:
Najczęstsze wykorzystanie typów wariantowych jest opisanie dane rekurencyjnych struktur. Rozważmy na przykład rodzaj drzew binarnych:
#type 'a btree = Empty | Node of 'a * 'a btree * 'a btree;;
type 'a btree = Empty | Node of 'a * 'a btree * 'a btree
Ta definicja brzmi następująco: a drzewo binarne zawierające wartości typu „a (dowolny rodzaj) jest albo pusta lub jest węzeł zawierający jedną wartość typu "ai dwóch poddrzew zawierający również wartości typu" a, , czyli dwa "a btree.
Operacje na drzewach binarnych to naturalnie wyrażone jako funkcje rekursywne o tej samej strukturze, co jako sama definicja typu. Dla przykład, oto funkcje wykonujące wyszukiwanie i wstawianie w zamówionych drzewo binarne (elementy wzrost od lewej do prawej):
#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>
Hope this helps
tak, ale używam tych drzewek do wykonywania składni zdań, więc nie mogę po prostu podać wartości tam. muszą utrzymać porządek, a ja miałem nadzieję, że uda się ustalić tę kolejność, prawidłowo tworząc drzewo, chociaż przypuszczam, że mógłbym użyć typu opakowania z zarówno liczbą, jak i samym słowem ... –
Ty * możesz * ustalić kolejność według poprawnie utworzyć drzewo. W rzeczywistości zestaw modułów zachowuje elementy drzewa w kolejności (najniższy element w lewym skrajnym potomku), więc nadal uważam, że to dobre źródło inspiracji. –