![使用 TikZ/PGF 向树节点添加垂直箭头](https://linux22.com/image/258860/%E4%BD%BF%E7%94%A8%20TikZ%2FPGF%20%E5%90%91%E6%A0%91%E8%8A%82%E7%82%B9%E6%B7%BB%E5%8A%A0%E5%9E%82%E7%9B%B4%E7%AE%AD%E5%A4%B4.png)
我正在尝试说明二叉搜索树的算法过程,为此我需要制作各种图形,每次突出显示不同的节点。
我希望使用指向这些节点的垂直箭头来突出显示这些节点,并在箭头上方附上描述文字,以及给定节点的颜色(灰度,因为该文档用于打印)突出显示。
这是我用于基本二叉搜索树的代码(*):
\begin{tikzpicture}[level/.style={sibling distance=30mm/#1}]
\node [circle,draw] (a){$26$}
child {node [circle,draw] (b){$15$}
child {node [circle,draw] (c){$9$}}
child {node [circle,draw] (d){$20$}
child {node [circle,draw] (e){$19$}}
child {node [circle,draw] (f){$24$}}
}
}
child {node [circle,draw] (g){$31$}
child[missing]
child {node [circle,draw] (i){$35$}
child[missing]
child {node [circle,draw] (k){$40$}}
}
};
\end{tikzpicture}
此代码在编译时(在上下文中)将产生以下结果:
我想要实现的目标是这样的:
我发现这问题,寻求类似的解决方案,但是我不想调整现有图形边的样式,而是想添加指向顶点的标签。有没有办法在不将此标签创建为树顶点的情况下做到这一点?
提前致谢!
(*)这只是整个文档的一小部分。基于 Manuel Kirsch 的示例,可在以下网址找到这里。
答案1
代码
child {node [circle,draw] (i){$35$}
将定义标记为i
因此您只需tikzpicture
像这样完成即可,例如:
\node[above=1cm of i] (new one) {Some text};
\draw[->,>=angle 60,ultra thick] (new one) -- (i);
这可能需要加载positioning
库,请参阅 Tikz 手册
编辑:要创建彩色节点,您只需在节点定义中添加相关键(node[...](i){}
)。我让您搜索一下 :-)
答案2
读完答案后假如Lionel MANSUY,我已经阅读了 TikZ/PGF 手册,可以找到这里(警告:3.75MB PDF!)本手册第 87 页有一个关于在网格上指定节点位置的示例。
在完成了该示例的工作后,我成功地使用以下代码为上面的原始问题创建了一个解决方案:
\begin{tikzpicture}[fill=gray!20]
\draw[style=help lines,color=white] (0,0) grid (7,3);
\path (2,3) node(a) [circle,draw] {$26$}
(1,2) node(b) [circle,draw] {$15$}
(0,1) node(c) [circle,draw] {$9$}
(2,1) node(d) [circle,draw] {$20$}
(1,0) node(e) [circle,draw] {$19$}
(3,0) node(f) [circle,draw] {$24$}
(3,2) node(g) [circle,draw,fill] {$31$}
(4,1) node(h) [circle,draw,fill] {$35$}
(5,0) node(i) [circle,draw] {$40$}
(7,2) node(j) [rectangle,draw] {u}
(7,1) node(k) [rectangle,draw] {Successor(u)};
\draw (a) -- (b);
\draw (b) -- (c);
\draw (b) -- (d);
\draw (d) -- (e);
\draw (d) -- (f);
\draw (a) -- (g);
\draw (g) -- (h);
\draw (h) -- (i);
\draw[->,thick] (j) -- (g);
\draw[->,thick] (k) -- (h);
\end{tikzpicture}
此代码在编译时(在上下文中)将产生以下结果:
对于我想要实现的目标来说,这个结果已经足够好了,但是另一方面,二叉搜索树的父子依赖关系在解决方案中丢失了,因此,如果我使用问题中的代码,以这种方式编辑二叉搜索树会不太舒服。
编辑:请注意,在我最初的问题中,我要求使用我在此答案中提供的基于网格的解决方案在节点顶部绘制箭头,我将这些箭头放在我想要指向的节点的右侧。如果我将节点 (j) 和 (k) 放在节点顶部,箭头将指向下方,而不是指向左侧。