wie kann ich Ebenen/binäre Bäume mit Punkten erstellen?

wie kann ich Ebenen/binäre Bäume mit Punkten erstellen?

Ich habe Binär- und Planebäume mit dem folgenden Code erstellt:

\documentclass{article}
\usepackage{tikz}  
\usetikzlibrary{positioning,chains,fit,shapes,calc}  
\begin{tikzpicture}
\node[circle,draw](z){}
  child[missing]{}
  child{
    node[circle,draw]{} child{node[circle,draw] {}} child[missing] };
\end{tikzpicture}
\end{document}

Es erzeugt sehr große Kreise an den Enden der Kanten und ich hoffe, stattdessen kleinere Knoten zu haben und irgendwann etwas zu erreichen, das so aussieht: Bildbeschreibung hier eingeben

Antwort1

Die Kreise sind aufgrund der Anzahl der Knoten groß . Sie können dies mit der Option (z. B. ) inner sepeinstellen , einzeln für jeden Knoten oder für das gesamte Bild mitinner sep=<length>inner sep=1pt

\begin{tikzpicture}[inner sep=1pt]

Oder Sie können Stile für Ihre Knoten festlegen, um deren Aussehen einfach individuell zu ändern, wie hier gezeigt

\documentclass{article}
\usepackage{tikz}  
\usetikzlibrary{positioning,chains,fit,shapes,calc}  

\begin{document}
\begin{tikzpicture}
\tikzset{dot/.style={inner sep=1pt,circle,draw,fill},
         circ/.style={inner sep=1pt,circle,draw}}
\node[dot](z){}
  child[missing]{}
  child{
    node[dot]{} child{node[circ] {}} child[missing] };
\end{tikzpicture}
\end{document}

Im Beispiel sind die neuen Styles dotund circnur im Tikzbild verfügbar. Verschiebt man die beiden Zeilen für \tikzsetin die Präambel, sind sie für alle Bilder verfügbar.

Antwort2

Wenn Sie viele Bäume zeichnen müssen, lohnt es sich, die Forest-Methode zu erlernen, da Sie damit ausdrucksstarke Stile erstellen können, die Sie auf äußerst präzise Baumspezifikationen anwenden können.

Wenn wir beispielsweise die drei Stile , und definieren dot tree, können wir Folgendes schreiben:dot tree spreadadd arrow

\begin{forest}
  dot tree spread,
  add arrow,
  [[[][]][][[[][][]]][]]
\end{forest}
\begin{forest}
  dot tree spread,
  add arrow,
  where level=0{!1.no edge, coordinate}{
    if n=1{}{
      edge path'={(!p) -- ()},
    },
  },
  [[[][]][][[[][][]]][]]
\end{forest}
\begin{forest}
  dot tree,
  where n children=0{
    before computing xy={l*=.5, s*=.5},
    edge+={densely dashed},
  }{},
  [[[][[][]]][[][[[][]][[[][[][[][]]]][]]]]]
\end{forest}

um die in der Frage gezeigte Reihe von drei Bäumen zu erzeugen:

Drei-Baum-Serie

Vollständiger Code:

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\begin{document}
\forestset{
  dot tree/.style={
    /tikz/>=Latex,
    for tree={
      inner sep=1pt,
      fill,
      draw,
      circle,
      calign angle=45,
      calign=fixed edge angles,
    },
    baseline,
    before computing xy={
      where n children>=4{
        tempcounta/.option=n children,
        tempdima/.option=!1.s,
        tempdimb/.option=!l.s,
        tempdimb-/.register=tempdima,
        tempdimc/.process={RRw2+P {tempcounta}{tempdimb}{##2/(##1-1)}},
        for children={
          if={>On>OR<&{n}{1}{n}{tempcounta}}{
            s/.register=tempdima,
            s+/.process={ORw2+P  {n} {tempdimc} {(##1-1)*##2} }
          }{},
        },
      }{},
    },
  },
  dot tree spread/.style={
    dot tree,
    for tree={fit=rectangle},
  },
  add arrow/.style={
    tikz+={
      \draw [thick, blue!15!gray]  (current bounding box.east) ++(2.5mm,0) edge [->] ++(10mm,0) ++(2.5mm,0) coordinate (o);
    }
  }
}
\begin{forest}
  dot tree spread,
  add arrow,
  [[[][]][][[[][][]]][]]
\end{forest}
\begin{forest}
  dot tree spread,
  add arrow,
  where level=0{!1.no edge, coordinate}{
    if n=1{}{
      edge path'={(!p) -- ()},
    },
  },
  [[[][]][][[[][][]]][]]
\end{forest}
\begin{forest}
  dot tree,
  where n children=0{
    before computing xy={l*=.5, s*=.5},
    edge+={densely dashed},
  }{},
  [[[][[][]]][[][[[][]][[[][[][[][]]]][]]]]]
\end{forest}
\end{document}

verwandte Informationen