Есть страшный способ сделать это, используя только минусы
:
(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, потому что они прекрасно поддаются структурному разделению в постоянной структуре данных. Карты и векторы на самом деле являются деревьями с высоким коэффициентом ветвления, что дает им ограниченное время поиска и вставки. Итак, самый короткий ответ, который я могу дать (хотя на самом деле он не так полезен), это то, что я действительно рекомендую чисто функциональные структуры данных Криса Окасаки для реального ответа на этот вопрос. Также видео Рича Хики о структурах данных Clojure на blip. tv
(set 'A 'B 'C)