在Clojure中代表一棵树

在Clojure中代表一棵树的习惯用法是什么? 例如:

A / \ BC /\ \ DEF 

性能不重要,树木不会超过1000个元素。

 '(A (B (D) (E)) (C (F))) 

有一个可怕的方式使用只是cons

 (defn mktree ([label lr] (cons label (cons lr))) ([leaf] (cons leaf (cons nil nil)))) (defn getlabel [t] (first t)) (defn getchildren [t] (rest t)) (defn getleft [t] (first (getchildren t))) (defn getright [t] (rest (getchildren t))) 

请注意,孩子不是一个清单; 这是一对。 如果你的树不只是二进制的,你可以把它作为一个列表。 当然没有左或右孩子的时候使用零。

否则,看到这个答案 。

照片中的树:

 (mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F))) 

Clojure中的所有东西都包含在树中,因为它们可以很好地适应持久数据结构中的结构共享。 地图和vector实际上是具有高支化因子的树,使它们有界的查找和插入时间。 所以我可以给出的最短的答案(尽pipe它并不真正有用),我真的推荐Chris Okasaki纯粹的函数式数据结构来为这个问题提供一个真正的答案。 Rich Hickey在blip.tv的Clojure数据结构上的video

 (set 'A 'B 'C)