2011-02-07 2 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 в РЕПЛ, линия так:

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

Но я получаю NullPointerException, но я не понимаю, почему я получая это исключение. Что-то не так с моим кодом?

+0

Если вы используете, по крайней мере, Clojure 1.2, я бы посмотрел на использование 'deftype' вместо' defstruct'. Если вы используете 'deftype', вы также можете использовать протоколы, которые сделают' add-bst' и подобные функции более приятными, потому что вы можете использовать 'extend-type' на' nil', эффективно позволяя вашему коду обрабатывать 'nil', как если бы он были узлом BST. – Brian

ответ

3

Я подозреваю, что это происходит потому, что вы повторно используете «BST» в параметров функции, которая запутанным STRUCT-карту, если значение равно нулю ....

Попробуйте переименовать параметр функции к чему-то еще.

+0

Я переименовал параметр и теперь получил следующую ошибку при попытке запуска этого '(add-bst 0 (struct-map bst: left nil: right nil: key 5))'. Вот ошибка: '# haluk

+1

@haluk: в ваших вызовах структурной карты вам необходимо указать ключ, а также значение, например. ": key (: key bst-t)" вместо просто "(: key bst-t)" – mikera

+0

@haluk: Пожалуйста, отредактируйте свой вопрос соответствующим образом. – Svante

Смежные вопросы