2011-02-07 34 views
3

我想熟悉Clojure,所以我開始實現一些基本的算法和數據結構。我目前在實現二叉搜索樹時遇到了問題。這裏是我的代碼:在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)) 

我嘗試添加隨機數到BST在REPL,行這樣:

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

但我得到一個NullPointerException,但我不明白爲什麼我得到這個例外。我的代碼有問題嗎?

+0

如果您至少使用Clojure 1.2,我會考慮使用'deftype'而不是'defstruct'。如果你使用'deftype',你也可以使用協議來使'add-bst'和類似的函數更好,因爲你可以在'nil'上使用'extend-type',這樣可以讓你的代碼看起來像'nil'一樣是BST節點。 – Brian

回答

3

我懷疑這是在你的函數的參數,這是混淆了結構映射,如果值是零,因爲你重新使用「BST」 ......

嘗試的功能參數重命名爲別的東西。

+0

我重命名了參數,現在當試圖運行這個'(add-bst 0(struct-map bst:left nil:right nil:key 5))'時,我得到了以下錯誤。這裏是錯誤:'# haluk

+1

@haluk:在你的struct-map調用中,你需要給出鍵值以及值。 「:key(:key bst-t)」而不是「(:key bst-t)」 – mikera

+0

@haluk:請編輯你的問題。 – Svante