\documentclass[paper=a4, fontsize=10pt]{article} % A4
\usepackage{tikz}
\tikzstyle{every node}=[circle,draw]
\begin{document}
\begin{tikzpicture}[level/.style={sibling distance=50mm/#1}]
\node {6}
child {
child {
node {2} edge from parent node[left,draw=none] {0}
}
child {
node {2} edge from parent node[right,draw=none] {1}
}
node {2} edge from parent node[left,draw=none] {0}
}
child {
node {$4$}
};
\end{tikzpicture}
\end{document}
这里发生的事情是,节点 (2) 是圆内的边...出于某种原因。有没有办法自动将 0 标记为左侧,将 1 标记为右侧?
将代码更新为:
\begin{forest}
for tree={
if n=1{edge label={node [midway, left, anchor=south] {0} } }{edge label={node [midway, right, anchor=south] {1} } },
draw,
circle,
if level=0{}{!u.s sep/.wrap pgfmath arg={#1}{35mm/(level())}},
anchor=mid,
}
[6
[2
[2
[1]
[1]
]
]
[4
[2]
]
]
\end{forest}
答案1
如果您想自动化树的绘制过程,例如自动0
在左侧和1
右侧添加标签,那么 Forest 可能是最好的选择。
例如:
\documentclass[tikz,multi,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={
if n=1{edge label={node [midway, left, anchor=south] {0} } }{edge label={node [midway, right, anchor=south] {1} } },
draw,
circle,
if level=0{}{!u.s sep/.wrap pgfmath arg={#1}{50mm/(level())}},
anchor=mid,
}
[6
[2
[if]
[(]
][4]
]
\end{forest}
\end{document}
如您所见,树的规范也非常简洁。
答案2
编辑:在阅读 @cfr 评论后,我不再确定我是否理解了正确的问题。如果三条边的标签必须在左侧,如果标签为零,则在右侧,如果标签为一,则在右侧,无论子节点是位于父节点的左下方还是右下方(这是我的理解),那么这个经典解决方案(不像森林那样净)也可以工作 :-):
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[auto,
every node/.style={circle,draw},
level/.style={sibling distance=50mm/#1}
]
\def\lbl#1{\ifnum#1=0 edge from parent node[draw=none,swap] {0}
\else edge from parent node[draw=none] {1}
\fi}
\node (1) {6}
child {node (2) {2}
child {node {if} \lbl{0}}
child {node {(} \lbl{1}}
\lbl{0}}
child {node (3) {$4$}
};
\end{tikzpicture}
\end{document}
对于标签定位,我定义了简单命令\lbl
(作为“标签”的缩写),对于边缘标签定位使用选项auto
。另请参见写入节点 (2) 的位置与它与其父节点之间的边缘的位置之间的区别。正如您在 MWE 中看到的,结果很奇怪。