2012-03-04 84 views
9

我正在使用樹的一些程序工作。我想知道是否有任何代碼在OCaml中繪製一般樹。OCaml:繪製二叉樹

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

我在互聯網上發現的所有使用Caml Light,而不是目標Caml。
在此先感謝。

+0

我編輯了自己的問題,爲更好的格式。請注意,名稱「Objective Caml」現在已被折舊,鼓勵人們只說「OCaml」(因爲「目標」部分在日常使用中並不突出,並且由於與「目標C」混淆)。 。 – gasche 2012-03-04 16:06:33

+0

好了,[樹是一個圖表] [1],所以 [1]:http://stackoverflow.com/questions/8999557/how-to-visualize-draw-automata-in-ocaml/9011334#9011334 – lambdapower 2012-03-05 20:22:58

回答

12

您能說清楚「draw」是什麼意思嗎?我假設你正在考慮樹的圖形可視化?

我已經有了相當不錯的經驗,可以使用工具graphviz生成點格式的圖形/樹形描述。這個想法是你的OCaml程序以這種格式生成圖形的文本表示,然後使用外部工具來渲染它(將其變成圖像),並可能將其顯示在屏幕上。

點適用於一般圖。雖然您可能會發現具有更多特徵的二叉樹的專用工具,但根據我的經驗,它適用於所有類型的樹,並顯示通常您所需的內容。現在這個工具並非沒有缺陷,而且我在某些情況下遇到了錯誤(稱爲dot段錯誤)。不過我認爲這是一個合理的選擇。

如何以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

謝謝,這正是我需要的。但不幸的是,它不適合我。這是我安裝後(我使用Linux)後得到的:警告:無法加載「/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 2012-03-04 17:46:25

+0

@maroxe:這看起來像一個分銷更新問題;絕對不是OCaml相關的,甚至可能不是Graphviz相關的(可能是libc版本問題或者是什麼)。在這個特定的問題上,你應該嘗試你的本地archlinux幫助論壇。 – gasche 2012-03-04 19:50:30

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

我正在尋找一種基於文本描述(可以很容易地生成)自動繪製的工具(無論ascii表示是否足夠)。 – maroxe 2012-03-04 17:59:19

+1

很簡單嗎?繪製二叉樹對我來說看起來相當混亂。我會嘗試使用[mlpost](http://forge.ocamlcore)而不是'Graphics'。org/projects/mlpost /),提供更高抽象級別的'metapost'的OCaml接口;或者可能至少有一個「cairo」綁定。 – gasche 2012-03-04 19:53:54

+1

ascii表示是否足夠?我用一些代碼更新了我的帖子... – 2012-03-04 20:21:31