2009-11-24 73 views
39

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

 A 
    /\ 
    B C 
    /\ \ 
D E F 

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

+27

跆拳道是你错了人,每当有人不喜欢的问题,他们打接近。 stackoverflow是一个非常好的学习地点,现在已经变成digg了,有很多白痴。如果你不喜欢这个问题那是什么反对票。 – 2009-11-24 04:43:38

+4

他们投票决定关闭它,因为它确实是重复的。 – Rayne 2009-11-24 05:42:43

+1

同意;这不是关于*喜欢*的问题;正如你所说的重新学习一些东西 - 也许从上次有人问同样的问题开始学习? – 2009-11-24 16:35:58

回答

30
'(A (B (D) (E)) (C (F))) 
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))) 

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

否则,请参阅this answer

在画面树:

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

它有第一个和其余的代替汽车cdr – 2009-11-24 04:38:16

+0

谢谢;)普通lisp有两个。我会编辑。它确实有'缺点'? – 2009-11-24 06:45:13

+0

我认为你应该编辑它来说“我只知道普通的lisp”。 Common Lisp不是'Lisp'。它是* a * Lisp。 – Rayne 2009-11-24 09:07:36

3

树underly只是在Clojure的一切,因为它们本身这么好听到持久性数据结构的结构共享。地图和矢量实际上是具有高支化因子的树,以使它们有界的查找和插入时间。所以我可以给出的最短答案(尽管它不是很有用),我真的推荐Purely functional data structures by Chris Okasaki作为这个问题的真正答案。还含有丰富希基对Clojure的数据结构视频blip.tv

(set 'A 'B 'C)