我正在尝试在 LaTeX 中创建二叉搜索树。
有两个节点相互重叠“阻塞”。
有人有这方面的经验并知道如何解决它吗?我将在这里展示我的代码以及问题的图片。
\begin{tikzpicture}
\node[circle,draw](z){$4$}
child{
node[circle,draw]{1}
child[missing]
child{node[circle,draw]{2}}
}
child{
node[circle,draw]{6}
child{node[circle, draw]{5}}
child{node[circle,draw]{9}
child{node[circle, draw]{7}} child[missing]}};
\end{tikzpicture} \\
这是该问题的图片:
答案1
您可以设置,level distance
例如sibling distance
使用选项
\begin{tikzpicture}[level distance=15mm,level/.style={sibling distance=40mm/#1}]
或者更详细地说:
\begin{tikzpicture}[level distance=10mm,
level 1/.style={sibling distance=32mm},
level 2/.style={sibling distance=16mm},
level 3/.style={sibling distance=8mm}]
\node[circle,draw](z){$4$}
child{
node[circle,draw]{1} child[missing] child{node[circle,draw]{2}}
}
child{
node[circle,draw]{6} child{node[circle, draw]{5}} child{node[circle,draw]{9}
child{node[circle, draw]{7}} child[missing]}};
\end{tikzpicture}
两种方法都有效。
答案2
TikZ 手册写得很好,有几个例子可以帮助我们理解它的工作原理和使用方法。其中一个教程解决了这个问题“约翰内斯的讲座地图”。Till 使用的第一个例子展示了这个问题,引用了他的话
节点重叠是由于 TikZ 在放置子节点时不是特别智能。尽管可以配置 TikZ 以使用相当聪明的放置方法,但 TikZ 无法考虑子节点的实际大小。这可能看起来很奇怪,但原因是子节点是一次渲染和放置一个的,因此在处理第一个节点时不知道最后一个节点的大小。本质上,您必须“手动”指定适当的级别和同级节点间距。
正如@corporal 在他的/她的回答中所展示的,这是手动解决方案。
TikZ 手册中还有graphdrawing
库。它旨在帮助我们绘制遵循结构逻辑的图形,如流程图和树。有了它,我们就可以告知 TikZ 我们图形的“逻辑”,然后它使用算法来布局图形。它的用法相当先进,但根据相应图形的大小/逻辑,它可能非常有用。它的巨大优势在于不需要指定任何节点位置,只需指定彼此之间的关系。该graphdrawing
库的一个缺点是它需要用 进行编译luatex
。
graphdrawing
这是使用和构建 OP 图的 MWE lua
。请注意,没有指定位置和节点间距。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs,graphdrawing}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}
\graph [binary tree layout, nodes={draw,circle}] { 4 -- {
1 -- 2,
6 -- {
5,
9 -- 7}}};
\end{tikzpicture}
\end{document}
结果: