いろいろがんばりたいブログ

情報科学科の人がいろいろ書きます。

GraphVizで木を書こう。

GraphVizというソフトでn分木を書く。
GraphVizについてはhttp://ja.wikipedia.org/wiki/Graphvizを参照。
インストールして、コマンドラインからdotを叩けるようになっている前提。
インストール方法についてはArchなら、pacman -S graphviz で。
それ以外はググってください。

Graphvizそのもののチュートリアルは
http://homepage3.nifty.com/kaku-chan/graphviz/
を参照するといいです。いいものです。

二分木を書く方法について。
ぶっちゃけ graphviz binarytreeでぐぐればでてくる。
http://www.linuxjournal.com/article/7275
こんな感じでやるとよりよい。

digraph Expression
{
        node [shape = record];

        node0  [ label ="<f0> | <f1> + | <f2> "];
        node1  [ label ="<f0> | <f1> * | <f2> "];
        node4  [ label ="<f0> | <f1> / | <f2> "];
        node6  [ label ="{<f1> MAX | { <u1> | <u2> | <u3> }}"];
        node2  [ label ="<f0> | <f1> - | <f2> "];
        node5  [ label ="2"];
        node9  [ label ="<f0> | <f1> / | <f2> "];
        node8  [ label ="10"];
        node10 [ label ="3"];
        node7  [ label ="6"];
        node3  [ label ="3"];
        node11 [ label ="1"];
        node12 [ label ="<f0> | <f1> * | <f2> "];
        node13 [ label ="4"];
        node14 [ label ="5"];
        node15 [ label ="9"];


        node0:f0 -> node1:f1;
        node0:f2 -> node2:f1;

        node1:f0 -> node4:f1;
        node1:f2 -> node6;
        node4:f0 -> node7;
        node4:f2 -> node3;

        node2:f0 -> node5;
        node2:f2 -> node9:f1;

        node9:f0 -> node8;
        node9:f2 -> node10;

        node6:u1 -> node11;
        node6:u2 -> node12;
        node12:f0 -> node13;
        node12:f2 -> node14;
        node6:u3 -> node15;
}

f:id:tomoki_imai:20121111221119p:plain
ちなみに、別に、左とか右とかわけなくて良い木の場合はもっと楽。
(チュートリアル参照)
左右が欲しい場合にはこうせざるを得ないみたい。