Binärer Suchbaum Knoten rauslöschen

Cassy3

Mitglied
Hey Leute, ich bin neu hier, also seht es mir nach, dass der Post evtl. nicht so schön aussieht.
Im Endeffekt steht meine Aufgabe schon hier drüber.
Ich habe einen Binären Suchbaum erstellt und befüllt. Übersichtshalber lasse ich den Code weg.
Nun will ich einen Knoten entfernen, der die selbe Nummer hat wie der als Number übergebene Parameter.

Hier mein Lösungsansatz:
public BinaryTreeNode search(int number, BinaryTreeNode post, BinaryTreeNode prev) {

if (post.getNumber()==number && post==top) {
top=top.getSmaller();
}

else if (post.getNumber()==number && post.equals(prev.getSmaller())) {
if (prev.getSmaller().getSmaller()==null) {
prev.setSmaller(null);
}

else {
prev.setSmaller(prev.getSmaller().getSmaller());
}
}

else if (post.getNumber()==number && post.equals(prev.getLarger())) {
if (prev.getLarger().getLarger()==null) {
prev.setSmaller(null);
}

else {
prev.setLarger(prev.getLarger().getLarger());
}
}

else if (post==top){
search (number,post=post.getSmaller(),prev=top);
search (number,post=post.larger,prev=top);
}

else {
search(number, post=post.getSmaller(),prev=prev.getSmaller());
search(number, post=post.getLarger(),prev=prev.getLarger());
}

return null;
}

Ich bin mir zeimlich sicher, dass ich wieder Code für Code geschrieben habe und dann gibt es eine Simple Lösung, auf die ich einfach nicht komme.
Ich hoffe, ihr Könnt mir helfen und danke für jede Antwort. :)
 

mihe7

Top Contributor
Bitte Code-Tags benutzen (im Editor auf </> klicken).

Zum Problem: ein binärer Suchbaum besteht aus einem Wurzelknoten, sowie möglicherweise aus einem linken und rechten Teilbaum, der selbst ein binärer Suchbaum ist. Im linken Teilbaum stehen die Werte, die kleiner (oder gleich) dem Wert im Wurzelknoten sind, im rechten Teilbaum analog die größeren Werte. Jeder Knoten in einem Baum ist die Wurzel eines Teilbaums. Das sind alles schöne, rekursive Eigenschaften.

Schauen wir uns mal die Ergebnisse an. Was passiert grob, wenn man einen Wert entfernt?
  1. Ist der Baum leer, bleibt er leer.
  2. Enthält der Baum den Wert nicht, bleibt er unverändert.
  3. Enthält der Baum den Wert, dann gibt es einen Knoten k mit diesem Wert, der entfernt werden muss. Der Teilbaum, dessen Wurzel k war, erhält somit eine neue Wurzel oder ist nach dem Löschen leer.
  4. Enthält der Baum nur den Wert, dann ist der Baum nach dem Löschen des Werts leer.
Interessant ist vor allem, dass beim Löschen im Baum der alte Teilbaum ggf. eine neue Wurzel erhält. Das können wir nutzen, indem wir sagen: das Löschen liefert den Wurzelknoten des ggf. geänderten Baums:

Java:
BinaryTreeNode remove(BinaryTreeNode root, int valueToRemove) {
    BinaryTreeNode newRoot = root;
    return newRoot;
}

Soweit, so gut. Punkt 1 einbauen - das ist trivial und überspringe ich gleich mal. Als nächstes überlegen wir uns, dass es nur zwei Möglichkeiten gibt: entweder enthält root den Wert oder eben nicht. Wenn nicht, können wir anhand des Werts von root entscheiden, ob sich der zu löschende Wert im linken oder rechten Teilbaum befinden muss. An der Stelle nicht vergessen: wir bekommen für den jeweiligen Teilbaum ggf. einen neuen Wurzelknoten zurück...

Java:
BinaryTreeNode remove(BinaryTreeNode root, int valueToRemove) {
    if (root == null) {
        return null;
    }

    BinaryTreeNode newRoot = root;
    if (root.getValue() == valueToRemove) {
        // TODO
    } else if (root.getValue() < valueToRemove) {
        BinaryTreeNode newRight = remove(root.getRight(), valueToRemove);
        root.setRight(newRight);
    } else {
        BinaryTreeNode newLeft = remove(root.getLeft(), valueToRemove);
        root.setLeft(newLeft);
    }
    return newRoot;
}

Was aber, wenn root nun den Wert enthält? Bezogen auf root gibt es vier Möglichkeiten:

root hat

a) keinen Teilbaum
b) nur einen linken Teilbaum
c) nur einen rechten Teilbaum
d) einen linken und einen rechten Teilbaum


Gut, a) ist einfach: kein Teilbaum -> dann ist die neue Wurzel null
b) die Wurzel des linken Teilbaums bildet die neue Wurzel
c) die Wurzel des rechten Teilbaums bildet die neue Wurzel
d) wir müssen den Wert in der Wurzel durch seinen Vorgänger oder seinen Nachfolger ersetzen

Bei d) ist es egal, wofür man sich entscheidet. Ich nehme mal den Nachfolger, das ist der Wert des im am weitest links stehenden Knotens im rechten Teilbaum.

Den Code können wir ein wenig umbauen (newRoot brauchen wir nicht mehr) und alle Fälle sofort implementieren:
Java:
BinaryTreeNode remove(BinaryTreeNode root, int valueToRemove) {
    if (root == null) {
        return null;
    }

    if (root.getValue() == valueToRemove) {
        if (root.getLeft() == null) {
            return root.getRight();
        } else if (root.getRight() == null) {
            return root.getLeft();
        } else {
            int smallest = findSmallestValue(root.getRight());
            BinaryTreeNode newRight = remove(root.getRight(), smallest);
            root.setValue(smallest);
            root.setRight(newRight);
        }
    } else if (root.getValue() < valueToRemove) {
        BinaryTreeNode newRight = remove(root.getRight(), valueToRemove);
        root.setRight(newRight);
    } else {
        BinaryTreeNode newLeft = remove(root.getLeft(), valueToRemove);
        root.setLeft(newLeft);
    }
    return root;
}

Java:
int findSmallestValue(BinaryTreeNode root) {
    if (root.getLeft() == null) {
        return root.getValue();
    }
    return findSmallestValue(root.getLeft());
}

Wenn ich jetzt keinen Gedankenfehler drin hatte, sollte das in etwa funktionieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Binärer Suchbaum Knoten zählen Java Basics - Anfänger-Themen 1
G Java Binärer Suchbaum Java Basics - Anfänger-Themen 1
L Binärer Suchbaum Java Basics - Anfänger-Themen 2
U Binärer Suchbaum delete Java Basics - Anfänger-Themen 1
S Binärer Suchbaum - Size als Variabel in innerer Klasse speichern Java Basics - Anfänger-Themen 2
E binärer suchbaum Java Basics - Anfänger-Themen 8
K Binärer Suchbaum Java Basics - Anfänger-Themen 3
D Binärer Suchbaum Java Basics - Anfänger-Themen 11
Q Binärer suchbaum Java Basics - Anfänger-Themen 2
Y Binärer Suchbaum Java Basics - Anfänger-Themen 5
M Binärer Suchbaum Höhe Java Basics - Anfänger-Themen 6
G Hoffe jemand kann mir ein paar Tips geben:binärer Suchbaum Java Basics - Anfänger-Themen 3
E Binärer Suchbaum Java Basics - Anfänger-Themen 7
R binärer Suchbaum Java Basics - Anfänger-Themen 1
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
H binärer String nach int convertieren Java Basics - Anfänger-Themen 3
T Binärer String zu Integer Java Basics - Anfänger-Themen 12
P Binärer Baum mit Composite-Entwurfsmuster Java Basics - Anfänger-Themen 2
S binärer string in negativen int umwandeln Java Basics - Anfänger-Themen 4
C binärer Exponentenbereich bezogen auf das Dezimalsystem Java Basics - Anfänger-Themen 2
G Binärer Baum Java Basics - Anfänger-Themen 3
M Binärer Baum Tiefe Java Basics - Anfänger-Themen 14
T binärer Baum Java Basics - Anfänger-Themen 3
R binärer Baum Java Basics - Anfänger-Themen 2
O Suchbaum Elternknoten finden Level eines Knoten bestimmen Java Basics - Anfänger-Themen 24
N ID3 - Suchbaum ertellen! Java Basics - Anfänger-Themen 0
M Suchbaum implementieren Java Basics - Anfänger-Themen 8
C Methoden Methode zu einem Binären Suchbaum Java Basics - Anfänger-Themen 8
J Suchbaum Java Basics - Anfänger-Themen 3
B Datentypen Suchbaum - Rekursive Ausgabe Java Basics - Anfänger-Themen 1
N Binären Suchbaum erstellen, nachzuvollziehen Java Basics - Anfänger-Themen 0
W binären Suchbaum Kantenanzahl Java Basics - Anfänger-Themen 3
G Rekursion Suchbaum Java Basics - Anfänger-Themen 2
W Löschen Datenknoten Suchbaum Java Basics - Anfänger-Themen 4
H Suchbaum iterativ absteigen? Java Basics - Anfänger-Themen 3
N Tiefe im binären Suchbaum Java Basics - Anfänger-Themen 9
I Rekursives Löschen in Binärem Suchbaum Java Basics - Anfänger-Themen 2
A Suchbaum Java Basics - Anfänger-Themen 4
DasDogma Suche im Suchbaum Java Basics - Anfänger-Themen 2
D suchbaum out of heap space Java Basics - Anfänger-Themen 8
G Binäre Suchbaum + Erstellung des Programmes Java Basics - Anfänger-Themen 4
Bierhumpen Suchbaum problem. Java Basics - Anfänger-Themen 8
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
S Binärbäume knoten zählen Java Basics - Anfänger-Themen 16
T Collections Methode (Knoten hinzufügen) für Graphen Java Basics - Anfänger-Themen 32
H Knoten-Reihenfolge einer LinkedList invertieren Java Basics - Anfänger-Themen 11
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20
E Knoten eines Baumes unter Bedinung zählen Java Basics - Anfänger-Themen 2
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
L Baum Knoten zählen Java Basics - Anfänger-Themen 6
L B+Baum innere Knoten erstellen Java Basics - Anfänger-Themen 3
L Graphen: Anzahl Knoten // Knoten in Array speichern Java Basics - Anfänger-Themen 4
I Erste Schritte Referenz zum Knoten davor, in einer Liste Java Basics - Anfänger-Themen 4
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
S Baumstruktur: tiefsten Knoten finden Java Basics - Anfänger-Themen 3
B Methoden BinärBaum als String Knoten löschen Java Basics - Anfänger-Themen 5
J Baum Knoten löschen Java Basics - Anfänger-Themen 10
T Datentypen Knoten Großvater finden? Java Basics - Anfänger-Themen 12
S Methoden Abtrennen ab einem gegebenen Knoten eines Binärbaums Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B JTree knoten wird nicht übernommen Java Basics - Anfänger-Themen 4
L BinärTree, Knoten löschen Java Basics - Anfänger-Themen 6
Luk10 Anzahl der Knoten in einem Baum ausgeben! Java Basics - Anfänger-Themen 6
T gebe mir den ersten eltern knoten Java Basics - Anfänger-Themen 3
K verkettete Listen - Klasse Knoten Java Basics - Anfänger-Themen 19
L LinkedList vorgänger Knoten zurück geben Java Basics - Anfänger-Themen 4
H B-Baum: Knoten Position als Parameter oder als Variable im Objekt? Java Basics - Anfänger-Themen 4
D An bestimmten Knoten einer Liste zugreifen Java Basics - Anfänger-Themen 4
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
M Nachbar von Knoten bestimmen Java Basics - Anfänger-Themen 8
0x7F800000 zwei adjazenzlisten für jeden knoten eines graphen sinnvoll? Java Basics - Anfänger-Themen 17
C Bäume in Java. Knoten in Array speichern Java Basics - Anfänger-Themen 3
G eine Knoten aus einem Baum löschen. [SOLVED] Java Basics - Anfänger-Themen 7
F JTree-Knoten (DefaultMutableTreeNode) formatieren ? Java Basics - Anfänger-Themen 3
Y JTree: ein Knoten als Objekt Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben