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} 

ここに画像の説明を入力してください

関連情報