在Clojure中代表一棵树

Ham*_*aya 43 clojure data-structures

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

     A
    / \
   B   C
  /\    \
 D  E    F
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ehl 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)))
Run Code Online (Sandbox Code Playgroud)

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

否则,请参阅此答案.

你图片中的树:

(mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F)))
Run Code Online (Sandbox Code Playgroud)