在Clojure中表示树的惯用方法是什么? E.g:
A
/ \
B C
/\ \
D E F
表现并不重要,树木不会超过1000个元素。
答案 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)