
Я создаю двоичные и плоские деревья, используя следующий код:
\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}
На концах рёбер получаются очень большие круги, и я надеюсь вместо них сделать узлы поменьше, и в конечном итоге получить что-то вроде этого:
решение1
Круги большие из-за inner sep
узлов. Вы можете задать это с помощью опции inner sep=<length>
(например inner sep=1pt
), индивидуально для каждого узла или для всей картинки с помощью
\begin{tikzpicture}[inner sep=1pt]
Или вы можете задать стили для своих узлов, чтобы легко менять их внешний вид по отдельности, как показано здесь.
\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}
В примере новые стили dot
и circ
доступны только в tikzpicture. Если переместить две строки в \tikzset
преамбулу, они будут доступны для всех картинок.
решение2
Если вам нужно нарисовать много деревьев, вам стоит изучить Forest, поскольку он позволяет создавать мощные стили, которые можно применять к очень лаконичным спецификациям деревьев.
Например, определение трех стилей, dot tree
и 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}
для создания серии из трех деревьев, показанных в вопросе:
Полный код:
\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}