2015-10-27 4 views
0

Я пытаюсь построить двоичное дерево lisp. Функция должна сделать этотПостроение двоичного дерева в lisp

(buildBST ‘(6 9 2 1 7)) -> (6 (2 (1)()) (9 (7)())) 

код, который мы имеем до сих пор будет постоянно возвращаться ошибка

> 7 nil arguments should be of type real 

Вот наш код

(defun buildBst (lis) 
    (cond 
     ((null lis) 0) 
     ((atom lis) lis) 
     (t (if (>(car lis)(car(cdr lis))) 
       (buildBst(cdr lis)) 
       (buildBst(cdr lis)))))) 
+0

Вы не проверяете случай, когда 'lis' имеет только 1 элемент. Вы делаете '(> (car lis) (car (cdr lis))', но если есть только один элемент, '(car (cdr lis))' будет 'NIL'. – Barmar

+0

Обе альтернативы вашего оператора' if' do точно так же, что вы там? –

+0

Вы, кажется, не комбинируете рекурсивный вызов с тем, что у вас уже есть. Таким образом, конечный результат не будет деревом, он будет просто результатом внутренняя рекурсия. – Barmar

ответ

1

Наилучшим подходом было бы сделать функцию вставки :

(defun tree-insert-element (tree element) 
    (cond ((tree-null-p tree) 
     (make-tree element nil nil)) 
     ((< (tree-value tree) element) 
     (make-tree (tree-value tree) 
        (tree-left tree) 
        (tree-insert-element (tree-right tree) element))) 
     (t 
     (make-tree (tree-value tree) 
        (tree-insert-element (tree-left tree) element) 
        (tree-right tree))))) 

Таким образом, если вы хотите, чтобы вставить целую кучу вы можете сделать это:

(defun tree-insert-list (tree list) 
    (reduce #'tree-insert-element list :initial-value tree)) 

Конечно, вам нужно определить функции функция вставки использует, как я на самом деле не волнует, как вы выбираете для моделирования дерево. Из взгляда ожидаемого результата я думаю, make-tree может просто обернуть list*, но это не единственный способ сделать дерево!

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