В схеме я могу использовать define-struct
для создания двоичного дерева поиска, но как вы это делаете в Clojure?
Как создать двоичное дерево поиска в Clojure?
Ответ 1
Вы можете использовать structmaps. Чтобы определить один:
(defstruct bintree :left :right :key)
Чтобы создать экземпляр:
(struct-map bintree :left nil :right nil :key 0)
Затем вы можете получить доступ к значениям в структуре следующим образом:
(:left tree)
и др.
Или вы можете создать новые функции доступа:
(def left-branch (accessor bintree :left))
и используйте его:
(left-branch tree)
Ответ 2
Я не знаю Clojure, но я готов поспорить в том же, как вы это делаете в Scheme без define-struct
... просто cons вместе левая и правая ветки. Чтобы найти что-то, рекурсия, пока вы не нажмете атом.
Ответ 3
Простейшим способом было бы использовать дерево, которое уже определено в языке (каждая сортированная карта - это действительно дерево, если вам просто нужна другая функция для сравнения ключей, используйте sorted-map-by).
;;define function for comparing keys
(defn compare-key-fn [key1 key2] (< key1 key2) )
;;define tree and add elements
(def my-tree
(-> ;;syntax sugar
(sorted-map-by compare-key-fn) ;;this returns empty tree with given function to compare keys
(assoc 100 "data for key = 100") ;;below we add elements to tree
(assoc 2 "data for key = 2")
(assoc 10 "data for key = 10")
(assoc -2 "data for key = -1")))
;;accesing elements by key
(prn "element for key 100 =" (my-tree 100))
;;"erasing" elements from tree - in reality, what we are really doing, is returning a new tree that contains all elements of the old one, except the element we've just erased.
(def my-new-tree
(dissoc my-tree 2))
(prn my-new-tree) ;; to verify, that element 2 is "erased"