如何在Clojure中创建二进制搜索树?
在Scheme中,我可以使用如何在Clojure中创建二进制搜索树?,clojure,Clojure,在Scheme中,我可以使用define struct创建一个二元搜索树,但是在Clojure中如何实现它呢?我不知道Clojure,但我打赌这与在Scheme中不使用define struct的情况下实现它的方式相同。。。把左右两个分支连在一起。要找到某样东西,递归直到你碰到一个原子 不过,说真的,structmaps听起来像你想要的。我找到了。查找大约一半的structmaps。您可以使用structmaps。要定义一个: (defstruct bintree :left :right :k
define struct
创建一个二元搜索树,但是在Clojure中如何实现它呢?我不知道Clojure,但我打赌这与在Scheme中不使用define struct
的情况下实现它的方式相同。。。把左右两个分支连在一起。要找到某样东西,递归直到你碰到一个原子
不过,说真的,structmaps听起来像你想要的。我找到了。查找大约一半的structmaps。您可以使用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)
最简单的方法是使用语言中已经定义的树(每个排序的映射实际上都是一棵树,如果您只需要不同的函数来比较键,请使用排序的映射)
;;定义用于比较键的函数
(定义比较键fn[key1-key2](;语法糖
(按比较键fn排序的映射);;这将返回空树,其中包含用于比较键的给定函数
(assoc 100“key=100的数据”);下面我们将元素添加到树中
(关联2“密钥数据=2”)
(关联10“钥匙数据=10”)
(assoc-2“键的数据=-1”))
;;按键访问元素
(prn“键100的元素=“(我的树100))
;;“擦除”树中的元素-实际上,我们真正要做的是返回一个新的树,其中包含旧树的所有元素,除了我们刚刚擦除的元素。
(我的新树
(分解我的树(2))
(prn我的新树);;为验证元素2是否已“擦除”
未排序集?我认为这更合适,而且密钥可能是您存储的结构的一部分。排序映射迫使您分离出密钥并永远单独处理它。+1无论如何,如果我在被问到问题时看到了问题,它与我所说的很接近。这比使用嵌套列表或向量更好吗?因为密钥是命名的,并且它们保证了恒定的时间访问(列表是线性访问,尽管向量是恒定的)。虽然这是在2009年编写的,自那以后发生了很多变化。我只是推荐defstruct
,因为问题是关于scheme的定义结构的。
;;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"