Dibujar árboles binarios con etiquetas LaTeX

Dibujar árboles binarios con etiquetas LaTeX

¿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 PGFtiene 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}

ingrese la descripción de la imagen aquí

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} 

ingrese la descripción de la imagen aquí

información relacionada