在Clojure中代表一棵树

时间:2009-11-24 04:07:03

标签: data-structures clojure

在Clojure中表示树的惯用方法是什么? E.g:

     A
    / \
   B   C
  /\    \
 D  E    F

表现并不重要,树木不会超过1000个元素。

3 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:5)

使用cons

这是一种可怕的方式
(defn mktree 
  ([label l r] (cons label (cons l r))) 
  ([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)))

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

否则,请参阅this answer

图片中的树:

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

答案 2 :(得分:3)

树只是Clojure中的所有内容,因为它们非常适合持久数据结构中的结构共享。地图和矢量实际上是具有高分支因子的树,以便为它们提供有界查找和插入时间。所以我能给出的最短答案(虽然它并不是那么有用)是我真的建议Purely functional data structures by Chris Okasaki来回答这个问题。还有Rich Hickey在blip.tv上关于Clojure数据结构的视频

(set 'A 'B 'C)