Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Clojure中创建二进制搜索树?_Clojure - Fatal编程技术网

如何在Clojure中创建二进制搜索树?

如何在Clojure中创建二进制搜索树?,clojure,Clojure,在Scheme中,我可以使用define struct创建一个二元搜索树,但是在Clojure中如何实现它呢?我不知道Clojure,但我打赌这与在Scheme中不使用define struct的情况下实现它的方式相同。。。把左右两个分支连在一起。要找到某样东西,递归直到你碰到一个原子 不过,说真的,structmaps听起来像你想要的。我找到了。查找大约一半的structmaps。您可以使用structmaps。要定义一个: (defstruct bintree :left :right :k

在Scheme中,我可以使用
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"