每个树节点上的左标签和右标签相同 - TikZ

每个树节点上的左标签和右标签相同 - TikZ

我正在尝试形成一棵树,其中每个节点在节点前都有一个“(”,在节点后有一个“)”。我理解这可以通过类似以下方式实现:

\documentclass{standalone}

\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[sibling distance=10em,
        every node/.style = {shape=circle, draw, align=center}]]
    \node[label={left:(}, label={right:)}] {}
    child { node[label={left:(}, label={right:)}] {} }
    child { node[label={left:(}, label={right:)}] {}
            child { node[label={left:(}, label={right:)}] {}
                    child { node[label={left:(}, label={right:)}] {} }
                    child { node[label={left:(}, label={right:)}] {} }
                    child { node[label={left:(}, label={right:)}] {} } }
            child { node[label={left:(}, label={right:)}] {} } };
\end{tikzpicture}
\end{document}

给出以下结果:

在此处输入图片描述

但是,这并不理想,我宁愿不必每次都复制和粘贴相同的代码(某些可维护性)。我尝试将标签代码放在节点样式中,但这似乎不受支持。我尝试找到一种方法来创建一个可以分配标签的自定义节点,但我也很难让这样的事情发挥作用/无法在上面找到任何东西。

为了便于理解,我试图显示一个 Dyck 词的树形表示,其中执行 DFS 后的前后数字代表“(”和“)”的索引。

所需代码形式:

\begin{figure}
    \begin{tikzpicture}[sibling distance=10em,
            every node/.style = {shape=circle, draw, align=center}]] % <-- some style here for the ()?
        \node {}
        child { node {} }
        child { node {}
                child { node {}
                        child { node {} }
                        child { node {} }
                        child { node {} } }
                child { node {} } };
    \end{tikzpicture}
\end{figure}

答案1

问题是every node,这种样式会应用于标签,而标签也是节点,因此会产生无限递归。请使用every child node。这种样式旨在仅应用于子节点,而不应用于标签。

\documentclass{standalone}

\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[sibling distance=10em,
        ears/.style={shape=circle, draw, align=center,
            label={left:(}, label={right:)}},
        every child node/.style = {ears}]]
    \node[ears] {}
    child { node {} }
    child { node {}
            child { node {}
                    child { node {} }
                    child { node {} }
                    child { node {} } }
            child { node {} } };
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

无论出于什么原因,在中设置标签都every node/.style不起作用,但是,创建新的节点样式似乎可以。以下代码产生了所需的结果:

\documentclass{standalone}

\usepackage{tikz}

\tikzset{dyck/.style={
    draw,
    circle,
    label={left:(},
    label={right:)},
    }
}

\begin{document}
\begin{tikzpicture}[sibling distance=10em,
        every node/.style = {shape=circle, draw, align=center}]]
    \node[dyck] {}
    child { node[dyck] {} }
    child { node[dyck] {}
            child { node[dyck] {}
                    child { node[dyck] {} }
                    child { node[dyck] {} }
                    child { node[dyck] {} } }
            child { node[dyck] {} } };
\end{tikzpicture}
\end{document}

相关内容