2010-12-11 3 views
0

Je n'arrive pas à comprendre comment supprimer un élément du BST. Ceci est mon codeSuppression d'un élément d'un BST dans le schéma

(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))))))) 

Le minimum renvoie la valeur minimale dans l'arborescence. Si j'essaie de supprimer un élément qui n'est pas une feuille, il passe dans une boucle infinie. Comment puis-je le réparer?

+0

On dirait une copie de [cette question] (http://stackoverflow.com/questions/4374530/how-do-i-delete-from-a-binary-search-tree-in-lisp/4383580). –

Répondre

0

Je pense que votre plus gros problème réside dans cette section:

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

Vous retirez r de t, mais vous devriez vraiment supprimerons r du sous-arbre droit de t. Je ne suis pas sûr de savoir pourquoi vous utilisez mutabilité/réglage, soit; Je pense que cela complique les choses dans ce qui pourrait facilement être une fonction sans effet secondaire. Je voudrais essayer quelque chose comme:

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

Je dois aussi admettre que je suis un peu confus au sujet de votre intention avec la dernière ligne. À quoi utilisez-vous la liste vide?

+0

Juste pour clarifier, supprimer r de t plutôt que son sous-arbre est probablement ce qui provoque la récursion infinie. – ajduff574

0

Comme alternative, vous pouvez jeter un oeil ici pour la mise en œuvre l'ensemble de la BST dans le schéma:

Il est très bien documenté et vous donnerait un peu de perspicacité au sujet la façon dont vous pouvez structurer le code pour qu'il soit facile à lire et à déboguer. En particulier, il traite les retraits de feuilles et de nœuds (non-feuilles) séparément.

+0

Merci, je vais y jeter un coup d'oeil, mais j'aimerais vraiment savoir si mon code ne fonctionne pas. C'est un peu frustrant surtout que je viens de commencer à apprendre Scheme. – user

+0

D'accord - peut-être que ce que je voulais dire est: essayez de séparer votre code en fonctions qui fonctionnent plus simples, de sorte que vous pouvez tester si elles fonctionnent correctement. Ceci est similaire à ce qu'ils ont fait sur la page à laquelle je suis lié - vous n'avez pas à le faire de la même façon, mais vous pouvez le séparer en 'BST-remove' qui appelle' BST-leaf-remove 'et' BST-node-remove'. Cela l'aide à comprendre le code et à trouver le problème, car c'est beaucoup plus simple. –

Questions connexes