簡體   English   中英

OCaml:繪制二叉樹

[英]OCaml: draw binary trees

我正在研究一些使用樹木的程序。 我想知道是否有任何代碼可以在OCaml中繪制一般樹。

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

我在互聯網上找到的只使用Caml Light,而不是Objective Caml。
提前致謝。

你能用“畫畫”來澄清你的意思嗎? 我假設您正在考慮樹的圖形可視化?

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

Dot適用於一般圖形。 雖然您可能會發現具有更多功能的二叉樹專用工具,但根據我的經驗,它可以很好地適用於所有類型的樹並顯示通常您喜歡的內容。 現在該工具並非沒有缺陷,在某些情況下我遇到了bug(稱為dot segfaults)。 我仍然認為這是一個合理的選擇。

如何以dot格式具體輸出:選擇已有圖形的任何一個例子 ,結構將是非常明顯的:它只是一種文本格式。 然后你編寫運行在圖形結構上的代碼,用標簽等正確的東西調用Printf ,然后瞧。 例如, 這個例子看起來很好, 這里是源格式。 我引用相關部分:

/* 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";
    [...]
}

如果它簡單而不是太深,使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM