Methoden BinärBaum als String Knoten löschen

Basha

Mitglied
Hallo,

folgendes Problem, ich habe einen BinärBaum erstellt, der Strings als Knoten besitzt.
Nun habe ich eine löschmethode geschrieben die aber nicht funktionieren will.
Ich hoffe ihr könnt mir ein wenig helfen.

die Knoten classe
Java:
class Knoten {
   	public String daten;            // Datenelement
   	public Knoten links, rechts;  // Zeiger auf Nachfolgeknoten

        Knoten( String n ) {
     	daten  = n;
      	links  = null;
	rechts = null;
   	}
}


Hier die einfuege und loesch methode
Java:
public class Baum {

    public Knoten wurzel = null;    // Baum ist leer


 
// Einfuegen eines Knotens
/**
 * 
 * @param x der String das eingefügt werden soll. 
 */
    public void einfuegen(String x) {
        if (wurzel == null) {
            wurzel = new Knoten(x);
            save_value(x);
        } else {
            einrek(wurzel, x);
            save_value(x);
        }
    }


 // Knoten Loeschen

    public Knoten loeschen(String x) {
        Knoten stamm = wurzel;
        Knoten eltern = wurzel;

        boolean istEsLinks = true;

        if (wurzel == null) {
            return null;
        }

        while (stamm.daten.compareToIgnoreCase(x) != 0) {
            eltern = stamm;
            if (stamm.daten.compareToIgnoreCase(x) > 0) {
                istEsLinks = true;
                stamm = stamm.links;
            } else {
                istEsLinks = false;
                stamm = stamm.rechts;
            }
            if (stamm == null) {
                return null;
            }
            if (stamm.links == null && stamm.rechts == null) {

                if (stamm == wurzel) {
                    wurzel = null;
                } else if (istEsLinks) {
                    eltern.links = null;
                } else {
                    eltern.rechts = null;
                }

            } else if (stamm.rechts == null) {
                if (stamm == wurzel) {
                    wurzel = stamm.links;
                } else if (istEsLinks) {
                    eltern.links = stamm.links;
                } else {
                    eltern.rechts = stamm.links;
                }

            } else if (stamm.links == null) {
                if (stamm == wurzel) {
                    wurzel = stamm.rechts;
                } else if (istEsLinks) {
                    eltern.links = stamm.rechts;
                } else {
                    eltern.rechts = stamm.links;
                }

            } else {
                Knoten ersetzen = knotenErsetzen(stamm);

                if (stamm == wurzel) {
                    wurzel = ersetzen;
                } else if (istEsLinks) {
                    eltern.links = ersetzen;
                } else {
                    eltern.rechts = ersetzen;
                    ersetzen.links = stamm.links;
                }
            }
        }
        return stamm;
    }

    public Knoten knotenErsetzen(Knoten e) {
        Knoten elternErsetzen = e;
        Knoten ersetzen = e;

        Knoten stamm = e.rechts;

        while (stamm != null) {
            elternErsetzen = ersetzen;
            ersetzen = stamm;
            stamm = stamm.links;
        }
        if (ersetzen != e.rechts) {
            elternErsetzen.links = ersetzen.rechts;
            ersetzen.rechts = e.rechts;
        }
        return ersetzen;
    }

ich hoffe sehr dass ihr damit etwas anfangen könnt^^
mfg basha
 

Adelhorst

Mitglied
Hallo.
Ich würde an deiner Stelle zuerst einmal eine Methode schreiben, die dir zu deinem String den passenden Knoten findet und zurück gibt. Diese Methode kann man immer gebrauchen und damit hättest du schon einmal den ersten Schritt erledigt und hättest genau DEN Knoten, der entfernt werden muss.

Dein Ansatz hierzu ist noch nicht ganz vollständig:
Hier sagst du, wenn der stamm.string > als x ist, dann muss im linken Teilbaum gesucht werden; andernfalls muss in jedem Fall im rechten Teilbaum gesucht werden.
Du fragst hier aber NIE auf == 0 ab, somit wirst du NIE fündig werden!
Java:
            if (stamm.daten.compareToIgnoreCase(x) > 0) {
                istEsLinks = true;
                stamm = stamm.links;
            } else {
                istEsLinks = false;
                stamm = stamm.rechts;
            }
Also erstmal eine funktionierende 'Knoten find(String x)'-Methode erstellen und dann kannst du mit Entfernen weitermachen.
Was du als "stamm" bezeichnest könnte man auch als "teilbaum" oder besser "knoten" bezeichnen, und statt "eltern" würde ich eher "vater" vorschlagen, denn das sind eher die Bezeichnungen in einem Binärbaum. (Wurzel, Vater, Knoten, Blatt..)
 
Zuletzt bearbeitet:

Basha

Mitglied
Hallo,

eine such methode habe ich bereits.
so habe alles nu geändert was du mir vorgeschlagen hast.
aber ich verstehe um erhlich zu sein nicht warum ich auf == 0 abfragen soll es kann ja nur nach links oder rechts.

Java:
public Knoten suchen(String x) {
        Knoten knoten = wurzel;
        if (knoten.daten == null) {
            return null;
        }
        while (knoten.daten.compareToIgnoreCase(x) != 0) {
            if (knoten.daten.compareToIgnoreCase(x) > 0) {
                knoten = knoten.links;
            } else {
                knoten = knoten.rechts;
            }
        }
        return knoten;

    }

    public Knoten loeschen(String x) {
        Knoten knoten = wurzel;
        Knoten vater = wurzel;

        boolean istEsLinks = true;

        if (wurzel == null) {
            return null;
        }

        while (knoten.daten.compareToIgnoreCase(x) != 0) {
            vater = knoten;
            if (knoten.daten.compareToIgnoreCase(x) > 0) {
                istEsLinks = true;
                knoten = knoten.links;
            } else {
                istEsLinks = false;
                knoten = knoten.rechts;
            }
            if (knoten == null) {
                return null;
            }
            if (knoten.links == null && knoten.rechts == null) {

                if (knoten == wurzel) {
                    wurzel = null;
                } else if (istEsLinks) {
                    vater.links = null;
                } else {
                    vater.rechts = null;
                }

            } else if (knoten.rechts == null) {
                if (knoten == wurzel) {
                    wurzel = knoten.links;
                } else if (istEsLinks) {
                    knoten.links = knoten.links;
                } else {
                    knoten.rechts = knoten.links;
                }

            } else if (knoten.links == null) {
                if (knoten == wurzel) {
                    wurzel = knoten.rechts;
                } else if (istEsLinks) {
                    vater.links = knoten.rechts;
                } else {
                    vater.rechts = knoten.links;
                }

            } else {
                Knoten ersetzen = knotenErsetzen(knoten);

                if (knoten == wurzel) {
                    wurzel = ersetzen;
                } else if (istEsLinks) {
                    vater.links = ersetzen;
                } else {
                    vater.rechts = ersetzen;
                    ersetzen.links = knoten.links;
                }
            }
        }
        return knoten;
    }

    public Knoten knotenErsetzen(Knoten e) {
        Knoten elternErsetzen = e;
        Knoten ersetzen = e;

        Knoten stamm = e.rechts;

        while (stamm != null) {
            elternErsetzen = ersetzen;
            ersetzen = stamm;
            stamm = stamm.links;
        }
        if (ersetzen != e.rechts) {
            elternErsetzen.links = ersetzen.rechts;
            ersetzen.rechts = e.rechts;
        }
        return ersetzen;
    }
 

Adelhorst

Mitglied
Hallo.
Da muss ich dir Recht geben, da lag ICH falsch. Ich hatte die While-Abfrage mit !=0 übersehen, da prüfst du ja schon, ob der Knoten nicht schon den gesuchten String enthält. Sorry.
 

Adelhorst

Mitglied
Hallo.
Ich kann den weiteren Code von dir nicht tatsächlich verstehen.
Du machst Ersetzungen und dergleichen in einer while-schleife, wo du den tatsächlichen zu entfernenden Knoten ja erst noch suchst; alo noch gar nicht gefunden hast! Das irritiert mich schon mal.

Das Entfernen/Löschen eines Knotens mit mehr als einem Sohn ist nicht so einfach.
Meines Erachtens müsste es so ablaufen:

1. Betreffenden Knoten erstmal suchen.
(Bei der Suche muss man sich den Knoten(Sohn) merken, der den betreffenden String-/daten-wert x enthält, UND den dazugehröigen "Vater"-Knoten)

1a. Falls kein betreffender Knoten(Sohn) gefunden, dann abbrechen...

2b. Falls betreffender Knoten(Sohn) mit dem String x gefunden, dann ...
Fall1 (sehr einfach):
Hat dieser Knoten(Sohn) selbst keine weiteren Söhne, ist also ein 'Blatt', dann braucht nur der Verweis vom Vater auf diesen Knoten(Sohn) auf Null gesetzt werden. Damit ist dieser gelöscht, fertig.
Fall2 (einfach):
Hat dieser Knoten(Sohn) selbst nur EINEN Sohn (egal, ob Sohn.links oder Sohn.rechts), dann kann der Sohn-Knoten einfach entfernt werden, indem der Verweis "Vater-Sohn" auf "Vater-Sohn.links" bzw. "Vater-Sohn.rechts" umgebogen wird. Fertig.

Fall3 (schwierig):
Hat dieser Knoten(Sohn) selbst ZWEI Söhne, dann muss im linken Teilbaum von Knoten(Sohn) der MaxKnoten gesucht werden, d.h. man geht in den linken Teilbaum des Knoten(Sohn) und von da aus dann immer nur in die rechten Teilbäume, bis es nicht mehr weiter geht. Dann hat man den Knoten mit dem maximalen daten-Wert gefunden. Den Knoten nennen wir mal MaxKnoten.
(Für dieses Suchen kann man eine eigene Methode 'Knoten maxKnoten(Knoten x)' spendieren)
Nun muss man sich den daten-Wert dieses MaxKnoten merken (tmp = MaxKnoten.daten); dann muss durch rekursiven Aufruf der Methode 'löschen' dieser MaxKnoten gelöscht werden (löschen(MaxKnoten.daten)); und zum Schluß erhält der Knoten(Sohn) den gemerkten MaxKnoten-Wert (Sohn.daten = tmp).
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
D Binärbaum Blätter finden und Ausgeben Java Basics - Anfänger-Themen 22
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
E Erste Schritte Testklasse Binärbaum Java Basics - Anfänger-Themen 10
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
A Größten Eintrag aus Binärbaum löschen Java Basics - Anfänger-Themen 4
L Ganzen BinärBaum ausgeben? Java Basics - Anfänger-Themen 3
L Binärbaum (Stammbaum) Java Basics - Anfänger-Themen 8
S Binärbaum in PreOrder in ArrayList speichern Java Basics - Anfänger-Themen 0
J Methoden Binärbaum, Traversierung in Array speichern Java Basics - Anfänger-Themen 18
K BinärBaum 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
C Binärbaum mit grafischer Ausgabe Java Basics - Anfänger-Themen 0
J Binärbaum formatiert ausgeben. Java Basics - Anfänger-Themen 7
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
N Generischer Binärbaum - löschen Java Basics - Anfänger-Themen 1
M Binärbaum mit parent-Zeigern Java Basics - Anfänger-Themen 1
S Binärbaum kopieren Java Basics - Anfänger-Themen 6
B Binärbaum mit java implementieren! Java Basics - Anfänger-Themen 5
D Binärbaum Suche Java Basics - Anfänger-Themen 5
D Binärbaum probleme Java Basics - Anfänger-Themen 4
P Binärbaum - Primärschlüssel Java Basics - Anfänger-Themen 3
X Fehler Binärbaum Java Basics - Anfänger-Themen 6
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
P Binärbaum Ordnungsproblem Java Basics - Anfänger-Themen 8
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
P einen binärbaum implementieren Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B Binärbaum höhe herausfinden Java Basics - Anfänger-Themen 12
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
S Klassen Aufgabe: Binärbaum überprüfen Java Basics - Anfänger-Themen 16
S Binärbaum Java Basics - Anfänger-Themen 9
S Variable Parameterliste in Binärbaum Java Basics - Anfänger-Themen 2
N BinärBaum Hilfestellung Java Basics - Anfänger-Themen 8
S Binärbaum prüfen, ob sortiert oder unsortiert Java Basics - Anfänger-Themen 6
W Binärbaum zahlen addieren Java Basics - Anfänger-Themen 7
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
S Binärbaum Java Basics - Anfänger-Themen 7
I Binärbaum Java Basics - Anfänger-Themen 5
S Bitte um Hilfe beim unsortierten Binärbaum!! Java Basics - Anfänger-Themen 6
J Binärbaum getSize Java Basics - Anfänger-Themen 4
P Fragen zum Binärbaum Java Basics - Anfänger-Themen 3
S Binärbaum implementieren Java Basics - Anfänger-Themen 6
K Tiefe im Binärbaum Java Basics - Anfänger-Themen 2
G generischer binärbaum Java Basics - Anfänger-Themen 9
G Binärbaum und Wrapperklassen Java Basics - Anfänger-Themen 6
F Binärbaum codieren. Codeproblem! Java Basics - Anfänger-Themen 4
D rekursion im binärbaum Java Basics - Anfänger-Themen 11
0 Binärbaum als verkettete Liste Java Basics - Anfänger-Themen 3
T Binärbaum - noch ein "klitzekleiner Fehler" Java Basics - Anfänger-Themen 4
B Binärbaum auf Vollständigkeit prüfen Java Basics - Anfänger-Themen 15
G Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
G Binärbaum grafisch darstellen Java Basics - Anfänger-Themen 4
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben