2010-12-11 20 views
0

Ich kann nicht herausfinden, wie ein Element aus dem BST zu löschen. Das ist mein CodeLöschen eines Elements aus einem BST in Schema

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

Minimum gibt den Mindestwert im Baum zurück. Wenn ich versuche, ein Element zu löschen, das kein Blatt ist, geht es in eine Endlosschleife. Wie kann ich es reparieren?

+0

Sieht aus wie ein Duplikat von [diese Frage] (http://stackoverflow.com/questions/4374530/how-do-i-delete-from-a-binary-search-tree-in-lisp/4383580). –

Antwort

0

Ich denke, Ihr größtes Problem in diesem Abschnitt liegt:

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

Du r von t entfernen, aber Sie sollten wirklich r vom rechten Teilbaum von t werden entfernt. Ich bin nicht sicher, warum Sie auch Mutabilität/Einstellung verwenden; Ich denke, es macht Dinge komplizierter, was leicht eine Nebeneffektfunktion sein könnte. Ich würde versuchen, etwas wie:

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

Ich muss auch zugeben, dass ich ein bisschen verwirrt über Ihre Absicht mit der letzten Zeile bin. Wofür verwendest du die leere Liste?

+0

Nur um klar zu stellen, ist es wahrscheinlich, was die unendliche Rekursion verursacht, wenn man r von t anstatt von seinem rechten Teilbaum entfernt. – ajduff574

0

Als Alternative können Sie einen Blick hier für die gesamte Umsetzung von BST in Schema nehmen:

Es ist sehr gut dokumentiert ist und Sie einen kleinen Einblick geben würde, So können Sie den Code so strukturieren, dass er leicht zu lesen und zu debuggen ist. Insbesondere behandelt es Blatt- und Knoten (Nicht-Blatt) -Entnahmen separat.

+0

Danke, ich werde mich darum kümmern, aber ich würde wirklich gerne einen Einblick darüber bekommen, warum mein Code nicht funktioniert. Es ist ein wenig frustrierend, besonders, dass ich gerade angefangen habe, Scheme zu lernen. – user

+0

Zustimmen - vielleicht, was ich sagen wollte ist: Versuchen Sie, Ihren Code in Funktionen zu trennen, die einfacher funktionieren, damit Sie testen können, ob sie richtig funktionieren. Das ist ähnlich dem, was sie auf der Seite getan haben, mit der ich verlinkt habe - Sie müssen es nicht so machen, wie sie es getan haben, aber Sie können es in "BST-remove" trennen, das "BST-leaf-remove" aufruft 'und' BST-node-remove'. Dies hilft ihm, den Code zu verstehen und dann das Problem zu finden, da es auf diese Weise viel einfacher ist. –

Verwandte Themen