Rückwärts geführte Rekursion

Status
Nicht offen für weitere Antworten.

MyPiano

Mitglied
Hallo,

ich arbeite gerade an einem Binärbaum und die Löschfunktion macht mir ein wenig Kummer. Das kopieren der Knoten ist kein Problem, aber das eigentliche Löschen eines Knotens will nicht richtig funktionieren.

So sieht mein Baum in etwa aus. Die Idee ist jetzt, dass ich, wenn ich z.B. das Element 17 löschen will, den linken Subknoten von Knoten 17 kopiere und links an den Knoten anfüge. Soweit klappt das ganze auch noch (siehe Code unten). Das Problem liegt jetzt darin, dass ich den Knoten 17 jetzt löschen will und durch den Knoten 15 ersetzen will. Dazu müsste ich aber Eine Rekursion rückwärts durchführen und mein Verstand sagt mir, dass das nicht funktioniert. Deshalb stellt sich für mich die Frage, wie ich das am besten mache. Hat jemand dazu ne Idee?

Code:
                               --------------------------[33]
                              |
                       ----[17]-----
                      |            |
                   -[15]        --[21]------
                  |             |           |
                [12]          [18]       [29]

Code:
public void delete(int value) {
        BinaryTree temp = null;
        if (content != null) {
            if (value < content) {
                left.delete(value);
            } else if (value > content) {
                right.delete(value);
            } else if (value == content) {
                temp = right;
                right = null;
                left.right = temp;
            }
        }
    }
 
Zuletzt bearbeitet:

Marco13

Top Contributor
So ganz hab' ich nicht verstanden, wie das am Ende aussehen soll (bzw. das was ich verstanden hatte passt nicht zum geposteten Code).

Wenn man so traversiert, wie du im moment, und z.B. Knoten 15 löschen will, dann stellt man ja fest "this.content==15", und müßte dann "this" löschen: Vorher war node17.left==node15, und nachher müßte node17.left==node12 sein. Aber... wenn man erstmal bei node15 ist, kommt man an node17 ja nicht mehr ran.

Ich gehe davon aus, dass man dafür "einen Knoten voraus" schauen muss - also nicht mit "this.content" arbeiten, sonden mit "this.left.content" und "this.right.content". Im Konkreten beispiel: Wenn man 15 löschen würde, würde man traversieren, und bei Konten 17 würde man dann sowas machen wie
Code:
if (this.left.content == 15) // node17.left ist node15 - Der muss gelöscht werden
{
    this.left = this.left.left; // node17.left zeigt jetzt auf node12 - und node15 wurde gelöscht
...
Das kann auch ein bißchen komplizierter werden, aber dieses "Vorausschauen" ist wohl ein möglicher Ansatz, den du mal durchdenken könntest...
 
S

SlaterB

Gast
> wenn ich z.B. das Element 17 löschen will, den linken Subknoten von Knoten 17 kopiere und links an den Knoten anfüge

du nimmst den linken Subknoten von 17, kopierst ihn (warum?) und setzt ihn dann wieder links von Knoten 17 an,
wo er schon war? oder links an einen anderen Knoten?
klingt seltsam und mit dem Code nicht übereinstimmend, vielleicht verstehe ich etwas falsch,

in einem Binärbaum zu löschen kann ganz schön kompliziert sein, nach
Binärbäume, Suchbäume, Baumsortieren
müsstest du beim Löschen die 17 entfernen und durch die 21 ersetzen,
dort wo die 21 war, muss rekursiv auch ersetzt werden (die 21 wurde quasi gelöscht), die 29 eingefügt werden
 
S

Spacerat

Gast
Ich benenne die drei Zweige eines Knotens mal mit "parent", "left" und "right. Wir befinden uns an Position 17 und kennen damit dessen Zweige (15, 33 und 21). Hier holen wir uns die Instanz von Knoten 15 (nein, man kopiere sie nicht!), und setzen dort "parent" = 33 und "right" = 21. Somit tritt 15 an die Stelle von 17. Das Problem, was nun auftreten könnte, ist, das "right" bei 15 bereits gesetzt sein könnte. Dieser Zweig wäre dann auch verloren. Besser wäre es, zunächst den Wert von 17 zu invalidieren (nullsetzen) und den Knoten im Baum zu erhalten wenn er Kindknoten ("left" und oder "right") hat. Wenn der Knoten aufgrund der Tatsache das er keine Kindknoten mehr hat, entfernt werden kann, kann man noch rekursiv (den "parent"s folgend) prüfen welche Knoten ebenfalls entfernt werden können.
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A String rückwärts Allgemeine Java-Themen 3
Rayo Methoden Lauflängencodierung Rückwärts! Allgemeine Java-Themen 6
P Ordner und Unterordner rückwärts durchsuchen Allgemeine Java-Themen 3
C Reguläre Ausdrücke, String rückwärts durchsuchen Allgemeine Java-Themen 6
M Zeit läuft rückwärts Allgemeine Java-Themen 3
E Datei rückwärts einlesen Allgemeine Java-Themen 5
P Rekursion Aufrufbaum Allgemeine Java-Themen 7
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
Zeppi Rekursion StackOverflowError Allgemeine Java-Themen 4
J Rekursion Allgemeine Java-Themen 4
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
B Rekursion Allgemeine Java-Themen 11
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
J Rekursion Mergesort Allgemeine Java-Themen 10
R Rekursion Allgemeine Java-Themen 3
R Programm zur Rekursion Allgemeine Java-Themen 5
V Rekursion Allgemeine Java-Themen 2
J Denkfehler Rekursion Allgemeine Java-Themen 5
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
B Rekursion Allgemeine Java-Themen 2
B Rekursion Allgemeine Java-Themen 22
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
Hacer Rekursion- sumOfAllNodes Allgemeine Java-Themen 5
L Rekursion Binärbaum Allgemeine Java-Themen 7
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
Y Rekursion Allgemeine Java-Themen 19
M Permutation ohne Wiederholung mit rekursion Allgemeine Java-Themen 4
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
T Pascalsches Dreieck ohne array und rekursion Allgemeine Java-Themen 9
P Rekursion Allgemeine Java-Themen 9
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
W Rekursion-Probleme mit return Allgemeine Java-Themen 35
C Rekursion Fibonacci Allgemeine Java-Themen 31
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
eQuest Rekursion Dauer Allgemeine Java-Themen 6
Weiti Swingworker und Rekursion Allgemeine Java-Themen 8
L fragwürdige Rekursion Allgemeine Java-Themen 4
L Kleine Rekursion Allgemeine Java-Themen 12
M Rekursion!! Allgemeine Java-Themen 8
J Rekursion in Schleifenkonstrukt wandeln Allgemeine Java-Themen 21
R Rekursion Ablauflogik Allgemeine Java-Themen 19
Schandro StackOverflowError bei Rekursion verhindern Allgemeine Java-Themen 14
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
G Rekursion - Denksport Allgemeine Java-Themen 6
S Rekursion und StackOverflow Allgemeine Java-Themen 11
P Stackoverflow in Rekursion. Bin ich schuld oder Java? Allgemeine Java-Themen 9
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S Rekursion Allgemeine Java-Themen 2
Linad Tiefe der Rekursion als Abbruchbedingung Allgemeine Java-Themen 6
Linad Zahlensysteme -> Rekursion Allgemeine Java-Themen 4
N Frage zu einer Rekursion Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben