2010-12-11 2 views
0

Я не могу понять, как удалить элемент из BST. Это мой кодУдаление элемента из BST в схеме

(define remove (lambda (x t) 
     (if (< x (car t)) (list (car t) (remove x (cadr t)) (caddr t)) 
      (if (> x (car t)) (list (car t) (cadr t) (remove x (caddr t))) 
        (if (not(and (null? (cadr t)) (null? (caddr t)))) 
         (let ((r (minimum (caddr t)))) ((remove r t) (set-car! t r))) 
         (list '() (cadr t) (caddr t))))))) 

Минимум возвращает минимальное значение в дереве. Если я попытаюсь удалить элемент, который не является листом, он переходит в бесконечный цикл. Как я могу это исправить?

+0

Похож на дубликат [на этот вопрос] (http://stackoverflow.com/questions/4374530/how-do-i-delete-from-a-binary-search-tree-in-lisp/4383580). –

ответ

0

Я думаю, что ваша самая большая проблема заключается в этом разделе:

((remove r t) (set-car! t r)) 

Вы удаляете r из t, но вы действительно должны быть удаление r с правого поддерева t. Я не уверен, почему вы используете изменчивость/настройку; Я думаю, что это усложняет ситуацию в том, что легко может быть функцией, не связанной с побочными эффектами. Я хотел бы попробовать что-то вроде:

(list r (cadr t) (remove r (caddr t))) 

Я также должен признать, что я немного запутался о своем намерении с последней строкой. Для чего вы используете пустой список?

+0

Просто, чтобы уточнить, удаление r из t, а не его правое поддерево, вероятно, вызывает бесконечную рекурсию. – ajduff574

0

В качестве альтернативы, вы можете посмотреть здесь для всей реализации BST в схеме:

Это очень хорошо документированы и даст вам немного понимания о как вы можете структурировать код, который легко читать и отлаживать. В частности, он обрабатывает удаление листьев и узлов (без листьев) отдельно.

+0

Спасибо, я посмотрю на это, но мне бы очень хотелось услышать какое-либо представление о том, почему мой код не работает. Это немного расстраивает, особенно, что я только начал изучать Схему. – user

+0

Согласитесь - может, я хотел сказать: попробуйте отделить свой код от функций, которые работают проще, поэтому вы можете проверить, работают ли они правильно. Это похоже на то, что они сделали на странице, с которой я связан - вам не нужно делать это так же, как они это делали, но вы можете разделить ее на «BST-remove», который вызывает «BST-leaf-remove» 'и' BST-node-remove'. Это помогает понять код и затем найти проблему, поскольку это намного проще. –

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