【问题标题】:Implementing a binary search tree in clojure在 clojure 中实现二叉搜索树
【发布时间】:2011-02-07 16:55:14
【问题描述】:

我正在尝试熟悉 Clojure,因此我开始实现一些基本算法和数据结构。我目前在实现二叉搜索树时遇到问题。这是我的代码:

(defstruct bst :left :right :key)

(defn add-bst [n bst-t]
  (cond
    (nil? bst-t) (struct-map bst :left nil :right nil :key n)
    (< n (:key bst-t))  (struct-map bst :left (add-bst n (:left bst-t))
                                :right (:right bst-t) :key (:key bst-t))
    (> n (:key bst-t))  (struct-map bst :left (:left bst-t)
                                :right (add-bst n (:right bst-t)) :key (:key bst-t))
    true bst-t))

我试图将随机数添加到 REPL 中的 BST 中,如下所示:

(exercise.new-ns/add-bst 5 nil)

但我收到了NullPointerException,但我不明白为什么会收到此异常。我的代码有问题吗?

【问题讨论】:

  • 如果您至少使用 Clojure 1.2,我会考虑使用 deftype 而不是 defstruct。如果您使用deftype,您还可以使用使add-bst 和类似功能更好的协议,因为您可以在nil 上使用extend-type,有效地允许您的代码将nil 视为BST 节点.

标签: clojure


【解决方案1】:

我怀疑这是因为您在函数参数中重复使用“bst”,当值为 nil 时,这会混淆 struct-map....

尝试将函数参数重命名为其他名称。

【讨论】:

  • 我重命名了参数,现在尝试运行(add-bst 0 (struct-map bst :left nil :right nil :key 5)) 时出现以下错误。这是错误:#&lt;CompilerException java.lang.IllegalArgumentException: No value supplied for key: 5
  • @haluk:在您的结构映射调用中,您需要提供键和值,例如":key (:key bst-t)" 而不仅仅是 "(:key bst-t)"
  • 好吧,你是对的,我根据你的提示修复了代码。
猜你喜欢
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2012-03-24
  • 2010-11-22
  • 2013-05-03
  • 2019-02-20
相关资源
最近更新 更多