Ответ 1
Это могло бы помочь вам, если бы вы посмотрели ответы на аналогичный вопрос; они содержат ссылки на программное обеспечение, выполняющее именно ту визуализацию дерева, которую вы хотите.
Эстетика очень субъективна, так что это только мое мнение. Я думаю, что мои рекомендации (а не алгоритм) будут следующими. Я предполагаю, что порядок детей важен (так как это деревья двоичного поиска).
-
Интересны только координаты
x
; Координатыy
должны определяться только уровнем node. (Я бы счел это довольно уродливым, если бы это было нарушено, но, как я уже сказал, вкусы отличаются. Однако все остальное основывается на этом предположении.) -
Ни один узел на одном уровне не должен быть ближе некоторого фиксированного минимального расстояния (скажем
D
). -
Если node имеет двух детей в
x1
иx2
, я бы предпочел, чтобы он был помещен в(x1+x2)/2
. В некоторых случаях было бы предпочтительнее выбрать некоторую другую координату в[x1..x2]
(возможно, один из ее концов). Я предполагаю, что могут быть необычные случаи, когда предпочтительна координата вне[x1..x2]
. -
Если node имеет один дочерний элемент в
x1
, а его родительский элемент находится вxp
, я бы предпочел, чтобы он был помещен в(x1+xp)/2
(так, чтобы он лежал на линии, соединяющей ее родительскую с его ребенок). В некоторых случаях было бы предпочтительнее отклоняться от этого и выбирать некоторую другую координату в[xp..x1]
(или даже вне). -
Позвольте ширине звонка установить расстояние между левым и правым node. Ширина самого широкого уровня должна быть минимальной.
Эти руководящие принципы налагают ограничения, которые не могут быть выполнены в одно и то же время. Поэтому вы должны расставить приоритеты, и это снова субъективно. Например, что более важно, №4 или №5? Ваш эскиз для дерева < node подразумевает, что # 4 является более важным; если # 5 было более важно, вы бы получили изображение, похожее на дом (вертикальные линии); если оба важны, то ваш текущий результат будет в порядке.
Один из способов борьбы с этим - назначить веса руководящим принципам и определить штрафы, если они не соблюдены. Например, в руководстве №3 вы можете и наказать abs(x-(x1+x2)/2)
, если родитель находится в x
, который не находится на полпути между его дочерними элементами; вы также можете назначить вес, который расскажет вам, насколько это важно, по сравнению с другими рекомендациями. Затем вы должны попытаться свести к минимуму общее взвешенное наказание решения. В общем, это даст вам проблему оптимизации ограничений, и есть несколько способов решения таких проблем.