Подтвердить что ты не робот

Представление дерева в Clojure

Каким будет идиоматический способ представления дерева в Clojure? Например:.

     A
    / \
   B   C
  /\    \
 D  E    F

Производительность не важна, и деревья не будут расти за 1000 элементов.

4b9b3361

Ответ 1

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

Ответ 2

Там страшный способ сделать это, используя только 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)))

Ответ 3

Деревья лежат почти во всем, что есть в Clojure, потому что они так хорошо подходят для структурного обмена в постоянной структуре данных. Карты и векторы - это фактически деревья с высоким коэффициентом ветвления, чтобы дать им ограниченный поиск и время вставки. Поэтому самый короткий ответ, который я могу дать (хотя это и не так уж и полезно), - это то, что я действительно рекомендую Чисто функциональные структуры данных Криса Окасаки для реального ответьте на этот вопрос. Также Rich Hickey видео на Clojure структурах данных на blip.tv

(set 'A 'B 'C)