我正在尝试创建一些图形来说明如何使用数组索引来表示二叉树。因此,我希望树中的每个节点都有两个标签:一个在注释内,表示其值,一个在节点上方,表示其在数组中的索引。我已经创建了一个令人满意的图形,但我觉得应该有更好的方法来创建图形。
这是我的身材:
这是生成该图的代码:
\documentclass{article}
\usepackage{tkz-graph}
\GraphInit[vstyle = Normal]
\begin{document}
\begin{tikzpicture}
\tikzset{VertexStyle/.style = {draw, thick, circle, fill=yellow!80}}
\SetGraphUnit{1.6}
\Vertex[LabelOut=true, Lpos=90, Ldist=.12cm, L=\texttt{1}]{a}
\Vertex{4}
\SOWE[LabelOut=true, Lpos=90, Ldist=.12cm, L=\texttt{2}](4){b}
\SOWE(4){3}
\begin{scope}
\SetGraphUnit{1}
\SOWE[LabelOut=true, Lpos=90, Ldist=.12cm, L=\texttt{4}](3){d}
\SOWE(3){2}
\SOEA[LabelOut=true, Lpos=90, Ldist=.12cm, L=\texttt{5}](3){e}
\SOEA(3){1}
\Edge(3)(2)
\Edge(3)(1)
\end{scope}
\SOEA[LabelOut=true, Lpos=90, Ldist=.12cm, L=\texttt{3}](4){c}
\SOEA(4){2}
\begin{scope}
\SetGraphUnit{1}
\SOWE[LabelOut=true, Lpos=90, Ldist=.12cm, L=\texttt{6}](2){f}
\SOWE[L=1](2){1a}
\SOEA[LabelOut=true, Lpos=90, Ldist=.12cm, L=\texttt{7}](2){g}
\SOEA[L=1](2){1b}
\Edge(2)(1a)
\Edge(2)(1b)
\end{scope}
\Edge(4)(3)
\Edge(4)(2)
\end{tikzpicture}
\end{document}
为了创建标签,我绘制了每个节点(或顶点)两次:一次用于顶部标签,另一次用于底部标签。还有其他使用方法吗tkz-graph
?我意识到可能有更好的方法来绘制二叉树,但这对更一般的图形也很有用。
非常感谢大家的帮助。
答案1
这里是基于 的一个建议forest
,如果后面真的有更复杂的例子,强烈建议切换到forest
。
\documentclass{article}
\usepackage[edges]{forest}
\begin{document}
\tikzset{lbl/.style={label=above:#1}}
\begin{forest}
for tree={s sep=1cm,l sep=1.2cm,
draw, thick, circle, fill=yellow!80,
edge={thick}
}
[4,lbl=1
[2,lbl=3
[2,lbl=4]
[1,lbl=5]
]
[2,lbl=3
[1,lbl=6]
[1,lbl=7]
]
]
\end{forest}
\end{document}
请注意,这forest
提供了几乎无限的可能性来以编程方式绘制树。因此从长远来看,我真的认为你会从那里受益(但我当然可能是错的)。