Есть ли хороший инструмент для рисования бинарных деревьев с метками, которые визуализируются latex? Мне нужно, чтобы размещение узлов дерева выполнялось автоматически, потому что меток слишком много, чтобы вычислять их размещение вручную.
Если говорить точнее. Я могу легко контролировать формат вывода моих данных. Чего я не могу сделать, так это вывести в формат, в котором мне нужно вычислять координаты для каждого узла. Я хотел бы вывести данные в формат для инструмента, который может вычислять макет графика.
EDIT: Я заметил, что решение ниже, похоже, не принимает математику в метках. Например, код ниже не будет работать, но если я брошу доллары вокруг метки "x", то он будет работать. Это проблема, потому что мои метки - это матрицы 2x2.
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,graphdrawing,arrows.meta}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}[>=Stealth]
\graph[binary tree layout]
{
root->{$x$->{}}
};
\end{tikzpicture}
\end{document}
решение1
Последняя версия PGF
содержит ряд алгоритмов рисования графов (требующих lualatex
), включая версию метода Рейнгольда–Тилфорда, и может легко обрабатывать большое количество узлов.
В простейшем случае дерево можно задать следующим образом:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,graphdrawing,arrows.meta}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}[>=Stealth]
\graph[binary tree layout]{
a -> {
b -> {
c -> {
d -> { e, f },
g
},
h -> { i, j }
},
k -> {
l -> {
m -> { n, o },
p -> { q, r }
},
s -> {
v -> {w, x},
y -> {z}
}
}
}
};
\end{tikzpicture}
\end{document}
Также возможно создание «макросов графа», что означает, что спецификация графа может быть создана более или менее автоматически, даже с использованием lua
:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,graphdrawing,graphs.standard,arrows.meta}
\usegdlibrary{trees}
\begin{document}
\tikzgraphsset{%
levels/.store in=\tikzgraphlevel,
levels=1,
declare={full_binary_tree}{[
/utils/exec={
\edef\treenodes{%
\directlua{%
function treenodes(l)
if l == 0 then
return "/"
else
return "/ [layer distance=" .. l*10 .. "]-- {" .. treenodes(l-1) .. ", " .. treenodes(l-1) .. "}"
end
end
tex.print(treenodes(\tikzgraphlevel) .. ";")
}%
}
},
parse/.expand once=\treenodes
]}
}
\begin{tikzpicture}
\graph[binary tree layout, grow=down, sibling distance=5pt, significant sep=0pt, nodes={fill=red, draw=none, circle, inner sep=2.5pt, outer sep=0pt}]{
full_binary_tree [levels=7];
};
\end{tikzpicture}
\end{document}