¿Existe alguna buena herramienta para dibujar árboles binarios con etiquetas renderizadas en látex? Necesitaría que la ubicación de los nodos del árbol se realice automáticamente, porque hay demasiadas etiquetas para calcular su ubicación manualmente.
Para ser más especifico. Puedo controlar fácilmente el formato de salida de mis datos. Lo que no puedo hacer es generar en un formato en el que tengo que calcular las coordenadas de cada nodo. Me gustaría generar los datos en un formato para una herramienta que pueda calcular el diseño del gráfico.
EDITAR: Noté que la solución siguiente no parece aceptar matemáticas en las etiquetas. Por ejemplo, el siguiente código no funcionará, pero si coloco los dólares alrededor de la etiqueta "x", sí funcionará. Esto es un problema porque mis etiquetas son matrices de 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}
Respuesta1
La versión más reciente de PGF
tiene varios algoritmos de dibujo de gráficos (que requieren lualatex
), incluida una versión del método Reingold-Tilford, y puede manejar fácilmente una gran cantidad de nodos.
En el caso más simple, un árbol se puede especificar así:
\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}
También es posible crear "macros de gráficos", lo que significa que la especificación del gráfico se puede crear más o menos automáticamente, incluso usando 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}