你如何在Clojure中创建二叉搜索树?

时间:2009-10-23 02:45:42

标签: clojure

在Scheme中,我可以使用define-struct创建一个二叉搜索树,但是你如何在Clojure中做到这一点?

3 个答案:

答案 0 :(得分:18)

您可以使用结构图。定义一个:

(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)

答案 1 :(得分:1)

我不知道Clojure,但是我打赌它与你在没有define-struct的Scheme中一样,只是将左右分支放在一起。为了找到一些东西,递归直到你击中一个原子。

但是,严肃地说,结构图听起来像你想要的。我找到了this page。寻找大约一半的结构图。

答案 2 :(得分:1)

最简单的方法是使用已经在语言中定义的树(每个有序映射都是树,如果你只需要不同的函数来比较键,使用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"