Data structures 在Clojure中表示树

Data structures 在Clojure中表示树,data-structures,clojure,Data Structures,Clojure,在Clojure中表示树的惯用方法是什么?例如: A / \ B C /\ \ D E F 性能并不重要,树的长度不会超过1000个元素。有一种可怕的方法,只需使用cons: (defn mktree ([label l r] (cons label (cons l r))) ([leaf] (cons leaf (cons nil nil)))) (defn getlabel [t] (first t)) (defn getchil

在Clojure中表示树的惯用方法是什么?例如:

     A
    / \
   B   C
  /\    \
 D  E    F

性能并不重要,树的长度不会超过1000个元素。

有一种可怕的方法,只需使用
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

否则,请参见

图片中的树:

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

树是Clojure中几乎所有内容的基础,因为它们非常适合持久数据结构中的结构共享。映射和向量实际上是具有高分支因子的树,为它们提供有界的查找和插入时间。所以我能给出的最简短的答案(虽然它并没有那么有用)是我真的建议给这个问题一个真正的答案。还有Rich Hickey在blip.tv上关于Clojure数据结构的视频

(set 'A 'B 'C)

它使用first&rest代替了汽车(谢谢)CommonLisp同时具有这两种功能。我来编辑。它确实有“缺点”吗?我想你应该把它编辑成“我只知道公共lisp”。公共Lisp不是“Lisp”。这是一个口齿不清的问题。WTF对你们来说是错误的,每次有人不喜欢他们提出的问题。stackoverflow是一个学习东西的好地方,现在它已经交给了digg,有很多白痴。如果你不喜欢这个问题,那就投反对票吧。他们投票决定结束这个问题,因为它完全是重复的。同意;这不是喜欢这个问题;正如你所说,你正在学习一些东西——也许是从上次有人问同样的问题时学到的?适当的做法是否决投票并添加一条评论,指出原因。如果你有足够的社区意识去做前者,你也应该做后者。否则你就是怀有恶意。@MarcGravel-复制品在哪里?这是我刚才在谷歌上搜索“clojure树”的最佳结果。
'(A (B (D) (E)) (C (F)))