我正在使用 tikz 绘制 AVL 树。我有以下代码:
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{trees}
\begin{document}
\begin{center}
\begin{tikzpicture}
\node[circle,draw](z){19}
child{node[circle,draw]{16}
child{node[circle,draw]{11}}
child{node[circle,draw]{17}}}
child{node[circle,draw]{21}
child{node[circle,draw]{20}}
child{node[circle,draw]{26}}};
\end{tikzpicture}
\end{center}
\end{document}
它应该是平衡的 AVL 树。16 的右子节点应该是 17,21 的左子节点应该是 20。使用代码我得到了这个
如您所见,17 和 20 合并为一个节点。如何在不修改已绘制的所有其他树的情况下解决这个问题?
感谢您的回答!
答案1
您可以sibling distance
为每个级别指定一个。
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{trees}
\begin{document}
\begin{center}
\begin{tikzpicture}[
every node/.style={circle, draw},
level 1/.style={sibling distance=6em},
level 2/.style={sibling distance=3em},
]
\node (z){19}
child{node {16}
child{node {11}}
child{node {17}}}
child{node {21}
child{node {20}}
child{node {26}}};
\end{tikzpicture}
\end{center}
\end{document}
我还为每个添加了一种样式node
,可以清理您的代码。
答案2
使用该forest
包后,树代码更简单,并且节点不会重叠:
\documentclass{scrartcl}
\usepackage{forest}
\begin{document}
\begin{center}
\begin{forest}
for tree = {
% nodes
circle, draw,
minimum size = 2em,
inner sep = 2pt,
% tree
grow = south,
l sep = 9mm, % vertical distances between nodes
s sep = 3mm % horizontal distances between nodes
}
[19
[16
[11]
[17]
]
[21
[20]
[26]
];
]
\end{forest}
\end{center}
\end{document}