
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:
Antwort1
Die Kreise sind aufgrund der Anzahl der Knoten groß . Sie können dies mit der Option (z. B. ) inner sep
einstellen , 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 dot
und circ
nur im Tikzbild verfügbar. Verschiebt man die beiden Zeilen für \tikzset
in 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 spread
add 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:
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}