2012-03-04 7 views
9

私はツリーを使っていくつかのプログラムを開発中です。 OCamlで一般的なツリーを描画するコードがあるかどうか疑問に思っていました。OCaml:バイナリツリーを描画する

type Tree = Node of Tree * int * Tree | Child of int;; 

私はインターネットでCaml Lightを使用していますが、Objective Camlでは使用できません。
ありがとうございます。

+0

を。 "Objective Caml"という名前は現在価値が下がっているので、 "Objective"の部分は日常的な使用ではあまり目立たないし、 "Objective C"との混乱のために "OCaml" 。 – gasche

+0

さて、[ツリーグラフである] [1]、そう [1]:http://stackoverflow.com/questions/8999557/how-to-visualize-draw-automata-in-ocaml/9011334#9011334 – lambdapower

答えて

12

"ドロー"とは何を意味するのでしょうか?私はあなたがツリーのグラフィカルな視覚化を考えていると思いますか?

ツールgraphvizで使用されている、ドット形式のグラフ/ツリー記述を生成するのにかなり良い経験をしています。あなたのOCamlプログラムは、この形式のグラフのテキスト表現を生成し、外部ツールを使ってそれをレンダリング(画像に変換)し、場合によってはそれを画面に表示するという考えがあります。

ドットは一般的なグラフで使用できます。私の経験では、より多くの機能を持つバイナリツリー用の特殊なツールがあるかもしれませんが、すべての種類のツリーでうまく機能し、通常は何かを表示します。今ではツールに欠陥がないわけではないので、場合によってはバグ(dot segfaultsを呼び出す)を打った。それでも、それは合理的な選択だと思う。

具体的にdot形式で出力するには:既に存在するグラフのexampleを選択すると、その構造は非常に明白になります。これは唯一のテキスト形式です。次に、グラフ構造上を実行しているコードを書いて、Printfにラベルなどの適切なものを付けて呼び出します。たとえば、this exampleがよく見え、hereがソース形式です。私は、関連部分を引用:

/* courtesy Ian Darwin and Geoff Collyer, Softquad Inc. */ 
digraph unix { 
    size="6,6"; 
    node [color=lightblue2, style=filled]; 
    "5th Edition" -> "6th Edition"; 
    "5th Edition" -> "PWB 1.0"; 
    "6th Edition" -> "LSX"; 
    "6th Edition" -> "Interdata"; 
    "Interdata" -> "Unix/TS 3.0"; 
    "Interdata" -> "PWB 2.0"; 
    "Interdata" -> "7th Edition"; 
    "7th Edition" -> "8th Edition"; 
    "7th Edition" -> "32V"; 
    "7th Edition" -> "V7M"; 
    "V7M" -> "Ultrix-11"; 
    "8th Edition" -> "9th Edition"; 
    [...] 
} 
+0

ありがとう、これは私が必要とするものです。しかし、残念ながら、それは私のために働いていない。警告:「/usr/lib/graphviz/libgvplugin_neato_layout.so.6」を読み込めませんでした - ファイルが見つかりません 警告:「/ usr/lib/graphviz/libgvplugin_xlib.so.6 " - ファイルが見つかりません /tmp/alpm_ygcg87/.INSTALL:1行目:16840セグメンテーション違反usr/bin/dot -c エラー:コマンドが正しく実行されませんでした – maroxe

+0

@maroxe:これはaのように見えます分布更新問題。確かにOCaml関連ではなく、おそらくgraphviz関連ではない(恐らく 'libc'バージョンの問題か、それとも何か)。この特定の問題については、あなたのローカルarchlinuxヘルプフォーラムを試してみてください。 – gasche

10

それは簡単で、あまり深くない場合には、あなたのツリーを描画するGraphicsライブラリを使用するために、通常は非常に簡単で面白いです。

あなたがテキスト表現したい場合:私はより良いフォーマットにあなたの質問を編集した

type tree = Node of tree * int * tree | Child of int;; 
let draw tree = 
    let rec print indent tree = 
    match tree with 
     Child n -> 
     Printf.printf "%s%d\n" indent n 
    | Node (left, n, right) -> 
     Printf.printf "%s----\n" indent; 
     print (indent^"| ") left; 
     Printf.printf "%s%d\n" indent n; 
     print (indent^"| ") right; 
     Printf.printf "%s----\n" indent 
    in 
    print "" tree 
+0

私は簡単に生成することができるテキストの記述に基づいて木を自律的に描くツールを探しています(アスキーの表現には関係なく)。 – maroxe

+1

非常に簡単ですか?バイナリツリーを描くことは私にはかなり面倒です。 'Graphics'ではなく、[mlpost](http://forge.ocamlcore。org/projects/mlpost /)は、より高いレベルの抽象化を提供する 'metapost'へのOCamlインタフェースです。または少なくとも「カイロ」結合であってもよい。 – gasche

+1

アスキー表現で十分ですか?私はいくつかのコードで私のポストを更新しました... –

関連する問題