2011-02-07 18 views
3

私はClojureに慣れようとしているので、いくつかの基本的なアルゴリズムとデータ構造を実装し始めました。私は現在、バイナリ検索ツリーの実装に問題があります。ここに私のコードは次のとおりです。clojureでバイナリ検索ツリーを実装する

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

しかし、私は NullPointerExceptionを得るが、私は、なぜ私は理解していない:

(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に行をランダムな番号を追加しようとしていましたこの例外が発生します。私のコードに何か問題がありますか?私は

....あなたは値がnilであるとき、構造体、マップを混乱さあなたの関数パラメータに「BST」を再使用しているので、それは疑う

+0

少なくともClojure 1.2を使用している場合は、 'defstruct'の代わりに' deftype'を使用します。 'deftype'を使うと、' add-bst'と同様の関数をより良くするプロトコルを使うこともできます。なぜなら 'nil'に' extend-type'を使うことができるからです。 BSTノードでした。 – Brian

答えて

3

は何か他のものに関数パラメータの名前を変更してください。

+0

パラメータの名前を変更しましたが、この '(add-bst 0(struct-map bst:left nil:right nil:key 5))'を実行しようとすると次のエラーが発生しました。ここにエラーがあります: '# haluk

+1

@haluk:構造体マップ呼び出しで、キーと値を与える必要があります。 ":(:key bst-t)"の代わりに ":key(:key bst-t)"を入力してください。 – mikera

+0

@haluk:それに応じて質問を編集してください。 – Svante

関連する問題