创建一棵树,其中所有左边缘均为 0,右边缘均为标签 1,并且节点为圆形绘制

创建一棵树,其中所有左边缘均为 0,右边缘均为标签 1,并且节点为圆形绘制
\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 中看到的,结果很奇怪。

相关内容