LaTeX 레이블을 사용하여 이진 트리 그리기

LaTeX 레이블을 사용하여 이진 트리 그리기

라텍스로 렌더링된 레이블을 사용하여 이진 트리를 그릴 수 있는 좋은 도구가 있습니까? 수동으로 배치를 계산하기에는 레이블이 너무 많기 때문에 트리 노드 배치를 자동으로 수행해야 합니다.

좀 더 구체적으로 말하자면. 데이터의 출력 형식을 쉽게 제어할 수 있습니다. 내가 할 수 없는 일은 각 노드의 좌표를 계산해야 하는 형식으로 출력하는 것입니다. 그래프 레이아웃을 계산할 수 있는 도구 형식으로 데이터를 출력하고 싶습니다.

편집: 아래 솔루션이 레이블에 수학을 허용하지 않는 것 같습니다. 예를 들어 아래 코드는 작동하지 않지만 "x" 레이블 주위에 달러를 놓으면 작동합니다. 내 레이블이 2x2 행렬이기 때문에 이것이 문제입니다.

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,graphdrawing,arrows.meta}
\usegdlibrary{trees}
\begin{document}
    \begin{tikzpicture}[>=Stealth]
        \graph[binary tree layout]
        {
            root->{$x$->{}}
        };
    \end{tikzpicture}
\end{document}

답변1

의 최신 릴리스에는 Reingold-Tilford 방법 버전을 포함하여 PGF다양한 그래프 그리기 알고리즘(필요 )이 있으며 많은 수의 노드를 쉽게 처리할 수 있습니다.lualatex

가장 간단한 경우 트리는 다음과 같이 지정할 수 있습니다.

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,graphdrawing,arrows.meta}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}[>=Stealth]
\graph[binary tree layout]{
  a -> {   
    b -> { 
      c -> { 
        d -> { e, f }, 
        g 
      }, 
    h -> { i, j }
    },
    k -> {
      l -> {
        m -> { n, o },
        p -> { q, r }
      }, 
      s -> {
        v -> {w, x},
        y -> {z}
      }
    }
  }
};
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

다음을 사용하여 그래프 사양이 거의 자동으로 생성될 수 있음을 의미하는 "그래프 매크로"를 생성하는 것도 가능합니다 lua.

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,graphdrawing,graphs.standard,arrows.meta}
\usegdlibrary{trees}
\begin{document}
\tikzgraphsset{%
  levels/.store in=\tikzgraphlevel,
  levels=1,
  declare={full_binary_tree}{[
    /utils/exec={
      \edef\treenodes{%
\directlua{%
  function treenodes(l)
    if l == 0 then
      return "/"
    else
      return "/ [layer distance=" .. l*10 .. "]-- {" .. treenodes(l-1) .. ", " .. treenodes(l-1) .. "}"
    end
  end
  tex.print(treenodes(\tikzgraphlevel) .. ";")
}%
      }
    },
    parse/.expand once=\treenodes 
  ]}
}
\begin{tikzpicture}
\graph[binary tree layout, grow=down, sibling distance=5pt, significant sep=0pt, nodes={fill=red, draw=none, circle, inner sep=2.5pt, outer sep=0pt}]{
   full_binary_tree [levels=7];
};
\end{tikzpicture}
\end{document} 

여기에 이미지 설명을 입력하세요

관련 정보