使用 Tikz Tree,我怎样才能使两个节点向上生长,而其余节点向下生长?

使用 Tikz Tree,我怎样才能使两个节点向上生长,而其余节点向下生长?

这是我第一次使用 Tikz。我有一个使用此代码的 Tikz 树

\documentclass{standalone}
\usepackage{tikz-qtree}
\begin{document}
\tikzset{every tree node/.style={minimum width=2em,draw,circle},
            blank/.style={draw=none}, 
            edge from parent/.style=
            {draw,edge from parent path={(\tikzparentnode) -- (\tikzchildnode)}},
            level distance=1.5cm}
\begin{tikzpicture}
\Tree
    [.c
        \edge[]; [.a 
        ]
        \edge[]; [.b
        ]
        \edge[]; [.d 
            \edge[]; {d1}
            \edge[]; {d2}
        ]
        \edge[]; [.e
            \edge[]; {e1}
            \edge[]; {e2}
        ]
    ]
\end{tikzpicture}
\end{document}

这给了我;

这棵树

我想要的是“a”位于“c”的左上方,“b”位于右上方,而树的其余部分则正常向下生长。

我一直在寻找 Tikz 示例,但还没有找到一个我喜欢的。欢迎提出任何建议。谢谢。

=== 第二次迭代

\documentclass{standalone}
\usepackage{tikz-qtree}
\begin{document}
    \tikzset{every tree node/.style={minimum width=2em,draw,circle},
                blank/.style={draw=none}, 
                edge from parent/.style=
                {draw,edge from parent path={(\tikzparentnode) -- (\tikzchildnode)}},
                level distance=1.5cm}
    \begin{tikzpicture}
    \Tree
        [.c
            \edge[]; \node(first) [draw, align=left, above=28mm, left=14mm] {\textbf{a}};
            \edge[]; \node(second) [draw, align=right, above=28mm, right=14mm] {\textbf{b}};
            \edge[]; [.d 
                \edge[]; {d1}
                \edge[]; {d2}
            ]
            \edge[]; [.e
                \edge[]; {e1}
                \edge[]; {e2}
            ]
        ]
    \end{tikzpicture}
\end{document}

几乎给我我想要的东西,但是“a”和“b”被挤压到左边。

向左挤压

答案1

更新: 这是一个更通用的解决方案

这是一个使用 的解决方案forest,它比 更灵活qtree。您可以使用 为各个节点添加手动调整。您可以使用 为或坐标before drawing tree添加或减去,或者使用 设置坐标。xyy±=<length>,x±=<length>y=<coordinate>,x=<coordinate>

我不清楚您是否还希望de子树被移动,以便它们相对于c节点对称。

在此处输入图片描述

\documentclass{article}

\usepackage{forest}

\begin{document}

\begin{forest}
for tree={draw,circle,minimum width=2em,anchor=center}
[c
    [a,before drawing tree={y=1cm,x=-1cm}]
    [b,before drawing tree={y=1cm,x=1cm}]
    [d
        [d1]
        [d2]]
    [e
        [e1]
        [e2]]]
\end{forest}

\end{document}

为了更灵活的解决方案,如果ab节点具有非空子树,您可以为节点创建两个空子节点c并设置它们的grow方向。但在计算空子节点的位置之前,使用before computing xy={l=0,s=0}将空节点放置在根节点。语法if level=1{<do this>}{<else do this>}可以放在主中for tree

在此处输入图片描述

\documentclass{article}

\usepackage{forest}

\begin{document}

\begin{forest}
for tree={minimum width=2.5em, anchor=center, circle,
    if level=1{no edge, before computing xy={l=0,s=0}}{draw}}
[c
[, for tree={grow'=north}
    [a[a1][a2]]
    [b[b1][b2]]]
[, 
    [d
        [d1]
        [d2]]
    [e
        [e1]
        [e2]]]]
\end{forest}

\end{document}

相关内容