Zeichnen von Binärbäumen mit LaTeX-Beschriftungen

Zeichnen von Binärbäumen mit LaTeX-Beschriftungen

Gibt es ein gutes Tool zum Zeichnen von Binärbäumen mit Beschriftungen, die von Latex gerendert werden? Ich müsste die Platzierung der Baumknoten automatisch für mich durchführen lassen, da es zu viele Beschriftungen gibt, um ihre Platzierung manuell zu berechnen.

Um genauer zu sein. Ich kann das Ausgabeformat meiner Daten problemlos steuern. Was ich nicht tun kann, ist die Ausgabe in einem Format, in dem ich die Koordinaten für jeden Knoten berechnen muss. Ich möchte die Daten in einem Format für ein Tool ausgeben, das das Diagrammlayout berechnen kann.

EDIT: Mir ist aufgefallen, dass die folgende Lösung anscheinend keine mathematischen Ausdrücke in den Beschriftungen zulässt. Beispielsweise funktioniert der folgende Code nicht, aber wenn ich die Dollarzeichen um die Beschriftung „x“ herum einfüge, funktioniert er. Das ist ein Problem, weil meine Beschriftungen 2x2-Matrizen sind.

\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}

Antwort1

Die neueste Version von PGFverfügt über eine Reihe von Algorithmen zum Zeichnen von Graphen (erfordert lualatex), darunter eine Version der Reingold-Tilford-Methode, und kann problemlos große Knotenzahlen verarbeiten.

Im einfachsten Fall kann ein Baum wie folgt angegeben werden:

\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}

Bildbeschreibung hier eingeben

Es ist auch möglich, „Graphmakros“ zu erstellen, was bedeutet, dass die Graphspezifikation mehr oder weniger automatisch erstellt werden kann, sogar mithilfe von 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} 

Bildbeschreibung hier eingeben

verwandte Informationen