如何将标题与用 tikz-qtree 绘制的树的每一级对齐?

如何将标题与用 tikz-qtree 绘制的树的每一级对齐?

我使用 TikZ-qtree 包绘制了一棵二叉树。

1) 我现在想将树右侧的标题与其每一层级对齐——并且我希望放置是自动的(理想情况下,我只需要指定我希望它位于树右边界的 Xpx 处,垂直定位会自行处理)。

2) 我希望能够在树中绘制几个括号,覆盖一些(连续的)节点。理想情况下,我只需指定节点,而不必关心定位!

这是我目前拥有的代码:

\documentclass{article}

\usepackage{tikz, pgf}
\usepackage{tikz-qtree}

\def\tn#1{{\bf #1}}    

\begin{document}
  \begin{tikzpicture}
    \Tree [.0 
            [.0 
              [.0
                [.{\tn 0} ]
                [.{\tn 1} ] ]
              [.1 
                [.{\tn 2} ]
                [.{\tn 3} ] ] ]
            [.1
              [.2 
                [.{\tn 4} ]
                [.0 
                  [.{\tn 0} ]
                  [.{\tn 1} ] ] ]
              [.3 
                [.1
                  [.{\tn 2} ]
                  [.{\tn 3} ] ]
                [.2
                  [.{\tn 4} ]
                  [.0 \edge[roof]; {... } ] ] ] ] ]
  \end{tikzpicture}
\end{document}

以下是我想要做的事情的一个例子:

Using a bitmap editing tool, this is what I would like to get (approximatively)

任何帮助都非常感谢。

答案1

对于标题,您可以在第一棵树的右侧绘制第二棵树,并将分支样式设置为[draw=none]。这将确保标题对齐。

对于下划线节点集,您需要使用命令创建起始和结束节点\node,然后绘制下划线。对于这部分,我使用了一些非常有用的代码,由杰克,它在 TikZ 中实现了与 PSTricks\ncbar命令等效的功能。

我还删除了您的\tn宏,这是不需要的,因为您可以为每个终端(叶)节点定义单独的样式tikz-qtree

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tikz-qtree}
% The following code is due to Jake
% and implements in tikz the equivalent of PSTrick's \ncbar command
% http://chat.stackexchange.com/transcript/message/4527875#4527875
\tikzset{
    ncbar/.style={
        to path=(\tikztostart)
        -- ($(\tikztostart)!#1!90:(\tikztotarget)$)
        -- ($(\tikztotarget)!#1!-90:(\tikztostart)$)
        -- (\tikztotarget)
    },
    ncbar/.default=0.25cm
}
% end Jake's code 

\begin{document}
  \begin{tikzpicture}[every leaf node/.style={font=\bfseries}]
    \Tree [.0 
            [.0 
              [.0
                \node (0) {0}; 
                 1  ]
              [.1 
                2
                3 ] ]
            [.1
              [.2 
                \node (4) {4};
                [.0 
                  0
                  1 ] ]
              [.3 
                [.1
                  2
                  3 ]
                [.2
                  4
                  [.0 \edge[roof]; {... } ] ] ] ] ]
  \draw[ncbar=-.4cm] (0) to (4);
  \begin{scope}[xshift=2in]
  \tikzset{edge from parent/.append style={draw=none}, 
  every tree node/.append style={font=\sffamily\bfseries}
  }
  \Tree [[.{V=2} [.{V=4} [.{V=8} [.{V=5} ] ]]]]
  \end{scope}
  \end{tikzpicture}
\end{document}

output of code

答案2

这是与实验版本 0.05 相同的树形排版justtrees.sty。(如果您愿意充当我的小白鼠,请告诉我,以便我可以为您提供最新版本。早期版本在此网站的某个地方。)

回答这个问题时justtrees让我修复一个以上的错误……


要在右侧添加标签,只需just=<label>对树中相应级别的任何节点说 即可。由于标签包含=在其中,因此在本例中需要用花括号保护它们。

节点组的括号使用新样式完成bracket me=<end node>。这应应用于组的最左侧节点。参数应是forest组最右侧节点的引用(名称或相对名称或别名等)。我在这里将 2 个这样的组括起来只是为了演示目的。

\documentclass[tikz,border=10pt]{standalone}
\usepackage{justtrees}% version 0.05
\begin{document}
\begin{justtree}
  {
    /tikz/every node/.append style={font=\sffamily},
    /tikz/select/.style={font=\sffamily\bfseries},
    just format={font=\sffamily\bfseries},
    /forest/bracket me/.style={
      tikz+={\draw [thick] (.south west) +(0,5pt) |- (#1.south east) -- +(0,5pt);}
    }
  }
  [0
    [0, just={v=2}
      [0, just={v=4}
        [0, just={v=8}, select, bracket me=4]
        [1, select]
      ]
      [1
        [2, select]
        [3, select]
      ]
    ]
    [1
      [2
        [4, select, name=4]
        [0
          [0, select, bracket me=p]
          [1, select]
        ]
      ]
      [3
        [1
          [2, just={v=5}, select]
          [3, select]
        ]
        [2
          [4, select, name=p]
          [0
            [\dots, triangle]
          ]
        ]
      ]
    ]
  ]
\end{justtree}
\end{document}

labels for tree

答案3

另一种解决方案是使用forest

  \begin{forest}
  label tree,
  for tree={
    circle,draw,
    s sep'=10pt, 
    edge+=thick,  
    font=\strut\footnotesize\sffamily,
  },
[A, name=lvl0
    [B
      [C, edge label={node[midway,left] {}} ] 
      [D] 
      [E
      [F]
      [G]
      ]
      ]
    [H, name=lvl1 
    [I
      [J]
      [K]
    ] 
      [L] 
      [M, name=lvl2 
      [N, name=lvl3
      ]
      ]
  ] 
]
\node[right=4.05cm of lvl0, Comment] {Level 0};
\node[right=1.75cm of lvl1, Comment] {Level 1};
\node[right=0.6cm of lvl2, Comment] {Level 2};
\node[right=0.6cm of lvl3, Comment] {Level 3};
\end{forest}

最小工作代码:

\documentclass[aspectratio=169,10pt]{beamer}
% \documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usepackage{forest}
\forestset{%
  label tree/.style={
    for tree={tier/.option=level},
    level label/.style={
      before typesetting nodes={
        for nodewalk={current,tempcounta/.option=level,group={root,tree breadth-first},ancestors}{if={>OR={level}{tempcounta}}{before drawing tree={label me=##1}}{}},
      }
    },
    before drawing tree={
      tikz+={\coordinate (a) at (current bounding box.north);},
    },
  },
  label me/.style={tikz+={\node [anchor=base west] at (.parent |- a) {#1};}},
}

\usetikzlibrary{arrows.meta, calc, positioning}

\tikzset{%
    Comment/.style={%
        draw=none,
        inner sep=0mm,
        outer sep=0mm,
        minimum height=5mm,
        align=right
    },
}


\begin{document}
\begin{frame}{}
  \begin{forest}
  label tree,
  for tree={
    circle,draw,
    s sep'=10pt, 
    edge+=thick,  
    font=\strut\footnotesize\sffamily,
  },
[A, name=lvl0
    [B
      [C, edge label={node[midway,left] {}} ] 
      [D] 
      [E
      [F]
      [G]
      ]
      ]
    [H, name=lvl1 
    [I
      [J]
      [K]
    ] 
      [L] 
      [M, name=lvl2 
      [N, name=lvl3
      ]
      ]
  ] 
]
\node[right=4.05cm of lvl0, Comment] {Level 0};
\node[right=1.75cm of lvl1, Comment] {Level 1};
\node[right=0.6cm of lvl2, Comment] {Level 2};
\node[right=0.6cm of lvl3, Comment] {Level 3};
\end{forest}
\end{frame}
\end{document}

该代码适用于投影仪以及其他类别。

A tree with level using forest

相关内容