Не могли бы вы уточнить, что вы подразумеваете под "рисовать"?Я предполагаю, что вы думаете о графической визуализации дерева?
У меня был достаточно хороший опыт создания описаний графиков / деревьев в формате точек, используемых инструментом graphviz .Идея состоит в том, что ваша программа OCaml генерирует текстовое представление графика в этом формате, затем вы используете внешние инструменты для его рендеринга (превращения в изображение) и, возможно, отображения его на экране.
Точка работаетдля общих графиков.Хотя вы можете найти специализированные инструменты для бинарных деревьев, которые имеют больше функций, по моему опыту, он довольно хорошо работает со всеми видами деревьев и отображает то, что обычно вам нравится.Теперь инструмент не лишен недостатков, и в некоторых случаях я сталкивался с ошибками (вызывая dot
segfaults).Тем не менее, я думаю, что это разумный выбор.
Как выводить в формате dot
конкретно: выбрать любой пример уже существующего графа, структура будет совершенно очевидна: это всего лишьтекстовый формат.Затем вы пишете свой код, работающий над структурой графа, вызывая Printf
с нужным материалом для меток и т. Д., И вуаля.Например, этот пример выглядит хорошо, а здесь - исходный формат.Я цитирую соответствующую часть:
/* courtesy Ian Darwin and Geoff Collyer, Softquad Inc. */
digraph unix {
size="6,6";
node [color=lightblue2, style=filled];
"5th Edition" -> "6th Edition";
"5th Edition" -> "PWB 1.0";
"6th Edition" -> "LSX";
"6th Edition" -> "Interdata";
"Interdata" -> "Unix/TS 3.0";
"Interdata" -> "PWB 2.0";
"Interdata" -> "7th Edition";
"7th Edition" -> "8th Edition";
"7th Edition" -> "32V";
"7th Edition" -> "V7M";
"V7M" -> "Ultrix-11";
"8th Edition" -> "9th Edition";
[...]
}