Rot-Schwarz-Bäume Java

Gansa

Aktives Mitglied
Guten Tag, ich habe einen Rotschwarz baum Algorithmus geschrieben, welches eigentlich auch funktioniert. Aber ich habe vorhin gemerkt das bei der Zahlenfolge: (35,9,50,57,68,43,46) meine 50 einfach verschwindet. Also die 50 sollte rechts der 46 liegen, aber nope da steht einfach ein null. Es wird in der LinksRotation Methode verschluckt, aber ich verstehe nicht warum. Weil bei allen anderen Inputs funktioniert der Code richtig. Ich kopiere mal alles rein, danke schon mal wenn Ihr mir helfen könnt! (Und die Wurzel ist immer Rot, ich weiss auch nicht warum, mein Lehrer meint das dass auch geht und er möchte das so haben) so sollte es aussehen:


Java:
public class BST {

    public static final boolean ROT = true; //1
    public static final boolean SCHWARZ = false; //0
    private Knoten wurzel;


    public Integer findeIndex(Integer key) {

        Knoten x = wurzel; //pointer zu aktuellem Knoten
        while (x != null) {
            int vergleich = key.compareTo(x.key);
            if (vergleich < 0) {
                x = x.linkesKind;
            } else if (vergleich > 0) {
                x = x.rechtesKind;
            } else return x.wert;
        }
        return null; //key nicht gefunden
    }


    public void tauscheFarben(Knoten h) { //färbe h rot und Kinder schwarz
        h.farbe = ROT;
        h.linkesKind.farbe = SCHWARZ;
        h.rechtesKind.farbe = SCHWARZ;
    }

    public Knoten put(Integer key, Integer wert) {
        wurzel = put(wurzel, key, wert);
        return null;
    }

    public Knoten put(Knoten h, Integer key, Integer wert) {

        if (h == null) {
            return new Knoten(key, wert, ROT);
        }

        int vergleich = key.compareTo(h.key);
        if (vergleich < 0) {
            h.linkesKind = put(h.linkesKind, key, wert);
        } else if (vergleich > 0) {
            h.rechtesKind = put(h.rechtesKind, key, wert);
        } else h.wert = wert;

        if (istRot(h.rechtesKind) && !istRot(h.linkesKind)) {
            h = linksRotation(h);
        }
        if (istRot(h.linkesKind) && istRot(h.linkesKind.linkesKind)) {
            h = rechtsRotation(h);
        }
        if (istRot(h.linkesKind) && istRot(h.rechtesKind)) { //wenn die kinder rot sind dann tausche farben
            tauscheFarben(h);
        }
        return h;
    }


    public Knoten linksRotation(Knoten h) {
        Knoten x = h.rechtesKind;
        h.rechtesKind = h.linkesKind;
        x.linkesKind = h;
        x.farbe = h.farbe;
        h.farbe = ROT;
        return x;
    }

    public Knoten rechtsRotation(Knoten h) {
        Knoten x = h.linkesKind;
        h.linkesKind = x.rechtesKind;
        x.rechtesKind = h;
        x.farbe = h.farbe;
        h.farbe = ROT;
        return x;
    }


    //prüfen ob Knoten rot ist, null referenzen sind immer schwarz

    public boolean istRot(Knoten x) {
        if (x == null) {
            return false;
        }
        return x.farbe == ROT;
    }

    public class Knoten {


        private Integer key;
        private Integer wert;

        public Knoten linkesKind, rechtesKind, eltern;
        boolean farbe;

        public Knoten(Integer key, Integer wert, boolean farbe) {
            this.key = key;
            this.wert = wert;
            this.farbe = farbe;
        }

    }
}


Java:
public class Main {
    public static void main (String [] args){

        BST bst = new BST();

        bst.put(35,0);
        bst.put(9,1);
        bst.put(50,2);
        bst.put(57,3);
        bst.put(68,4);
        bst.put(43,5);
        bst.put(46,6);

/* Let us create following BST
      35
   /     \
  9      57
 /  \    /  \
        46  68
       / \
      45  50

 */


    }
}
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Es wird in der LinksRotation Methode verschluckt, aber ich verstehe nicht warum.
Schauen wir mal:
Java:
    public Knoten linksRotation(Knoten h) {
        Knoten x = h.rechtesKind;
        h.rechtesKind = h.linkesKind;
        x.linkesKind = h;
        x.farbe = h.farbe;
        h.farbe = ROT;
        return x;
    }

In der dritten Zeile ersetzt Du das linke Kind von x - sofern da vorher eines war, ist es weg.
 

Gansa

Aktives Mitglied
Schauen wir mal:
Java:
    public Knoten linksRotation(Knoten h) {
        Knoten x = h.rechtesKind;
        h.rechtesKind = h.linkesKind;
        x.linkesKind = h;
        x.farbe = h.farbe;
        h.farbe = ROT;
        return x;
    }

In der dritten Zeile ersetzt Du das linke Kind von x - sofern da vorher eines war, ist es weg.
Okay danke jetzt hast geklappt. Aber jetzt wurde die 46 als Wurzel genommen, also mein Baum wurde nicht wie oben im Kommentar erstellt :/
 

Gansa

Aktives Mitglied
Was hast Du denn geändert?

habe es als Kommentar im code geschrieben was ich geändert habe,
davor stand bei mir

h.rechtesKind = h.linkesKind;

aber jetzt wird eben die 46 als Wurzel genommen ..
Java:
   public Knoten linksRotation(Knoten h) {
        Knoten x = h.rechtesKind;
        h.rechtesKind = x.linkesKind; //hier stand davor  h.rechtesKind = h.linkesKind;
        x.linkesKind = h;
        x.farbe = h.farbe;
        h.farbe = ROT;
        return x;
    }
 

Gansa

Aktives Mitglied
Äh:

bezog sich auf x.linkesKind = h :)


Nachtrag: Vergiss es.
Kannst du mir bei meinem zweiten Problem helfen? warum die 46 auf einmal die Wurzel wird, obwohl es so aussehen sollte

Java:
/* Let us create following BST
      35
   /     \
  9      57
 /  \    /  \
        46  68
       / \
      45  50

 */

Alle red black tree simulationen im Netz geben mir genau so einen tree, was ich per Hand auch so aufmalen würde, aber mein Code sagt das 46 die Wurzel sein müsse, ich verstehe nicht was das Problem ist.
 

mihe7

Top Contributor
Vielleicht hilft Dir ja mal eine Ausgabe, nach jedem Einfügen:
Code:
[35,0,true]lr
[35,0,true]r[9,1,true]lr
[35,0,true][50,2,false]lr[9,1,false]lr
[35,0,true][57,3,false]r[50,2,true]lr[9,1,false]lr
[57,3,true][68,4,false]lr[35,0,true][50,2,false]lr[9,1,false]lr
[57,3,true][68,4,false]lr[35,0,true][50,2,false]r[43,5,true]lr[9,1,false]lr
[46,6,true][57,3,false][68,4,false]lr[50,2,false]lr[35,0,false][43,5,false]lr[9,1,false]lr
Darstellung: [key,wert,farbe] - inorder (Wurzel, links, rechts), ein l steht, wenn der linke Kindknoten nicht vorhanden ist, analog r für den fehlenden rechten Kindknoten.

Da fällt mir spontan mal auf, dass die zweite Zeile
Code:
  35
  /
 9
beide Knoten als rot anzeigt... Die dritte Zeile eine falsche Reihenfolge hat:
Code:
  35
 /  \
50   9
 

Gansa

Aktives Mitglied
Vielleicht hilft Dir ja mal eine Ausgabe, nach jedem Einfügen:
Code:
[35,0,true]lr
[35,0,true]r[9,1,true]lr
[35,0,true][50,2,false]lr[9,1,false]lr
[35,0,true][57,3,false]r[50,2,true]lr[9,1,false]lr
[57,3,true][68,4,false]lr[35,0,true][50,2,false]lr[9,1,false]lr
[57,3,true][68,4,false]lr[35,0,true][50,2,false]r[43,5,true]lr[9,1,false]lr
[46,6,true][57,3,false][68,4,false]lr[50,2,false]lr[35,0,false][43,5,false]lr[9,1,false]lr
Darstellung: [key,wert,farbe] - inorder (Wurzel, links, rechts), ein l steht, wenn der linke Kindknoten nicht vorhanden ist, analog r für den fehlenden rechten Kindknoten.

Da fällt mir spontan mal auf, dass die zweite Zeile
Code:
  35
  /
9
beide Knoten als rot anzeigt... Die dritte Zeile eine falsche Reihenfolge hat:
Code:
  35
/  \
50   9
Hey ich wollte dich noch fragen wie du so eine schöne Ausgabe hinbekommen hast. Ich bekomme nur die werte und die Farbe auf die Reihe aber ob es ein linkes oder rechtes Kind ist, das konnte ich bis jetzt nicht umsetzen. Habe es versucht aber da ich nur ein System.out habe, kann Ich schlecht lk oder rk rein schreiben, das das abwechselnd ausgegeben wird. Meine print methode sieht bis jetzt so aus:

Java:
    public void inorder() {
        System.out.println("Farbe der Wurzel: "+ wurzel.key + " " + wurzel.farbe);
        inorderRec(wurzel);

    }

    // Durchlaufen des BST
    void inorderRec(Knoten wurzel) {
        if (wurzel != null) {

            inorderRec(wurzel.linkesKind);
            System.out.println(wurzel.key + " " + wurzel.farbe);
            inorderRec(wurzel.rechtesKind);

        }
    }


}
 

mihe7

Top Contributor
Hey ich wollte dich noch fragen wie du so eine schöne Ausgabe hinbekommen hast.
Naja, schön ist das nicht:
Java:
    public String toString() {
        StringBuilder b = new StringBuilder();
        if (wurzel == null) b.append("leer");
        else {
            java.util.Stack<Knoten> stack = new java.util.Stack<>();
            stack.push(wurzel);
            while (!stack.isEmpty()) {
                Knoten w = stack.pop();
                b.append('[').append(w.key).append(',').append(w.wert)
                    .append(',').append(w.farbe).append(']');
                if (w.linkesKind != null) {
                    stack.push(w.linkesKind);
                } else b.append("l");
                if (w.rechtesKind != null) {
                    stack.push(w.rechtesKind);
                } else b.append("r");
            }
        }
        return b.toString();

    }
 

Gansa

Aktives Mitglied
Naja, schön ist das nicht:
Java:
    public String toString() {
        StringBuilder b = new StringBuilder();
        if (wurzel == null) b.append("leer");
        else {
            java.util.Stack<Knoten> stack = new java.util.Stack<>();
            stack.push(wurzel);
            while (!stack.isEmpty()) {
                Knoten w = stack.pop();
                b.append('[').append(w.key).append(',').append(w.wert)
                    .append(',').append(w.farbe).append(']');
                if (w.linkesKind != null) {
                    stack.push(w.linkesKind);
                } else b.append("l");
                if (w.rechtesKind != null) {
                    stack.push(w.rechtesKind);
                } else b.append("r");
            }
        }
        return b.toString();

    }
Danke!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Rot Schwarz Bäume, ausführen? Java Basics - Anfänger-Themen 6
B Theorie Rot-Schwarz-Bäume Java Basics - Anfänger-Themen 2
G Rot-Schwarz-Baum Java Basics - Anfänger-Themen 8
A BufferedImage zeigt nur schwarz Java Basics - Anfänger-Themen 3
N Erste Schritte HSV color space - schwarz und weiß nur anhand von Saturation oder Multiplikator ermitteln Java Basics - Anfänger-Themen 14
K Rot-Schwarz-Baum min und max-Tiefe Java Basics - Anfänger-Themen 1
S JFrame ist nicht schwarz Java Basics - Anfänger-Themen 5
T Rot-schwarz Baum Problem Java Basics - Anfänger-Themen 3
J Frame bleibt schwarz beim Laden Java Basics - Anfänger-Themen 11
B Durchsichtige Images werden beim kopieren schwarz Java Basics - Anfänger-Themen 21
G eclipse Konsole schwarz Java Basics - Anfänger-Themen 4
P Bäume Java Basics - Anfänger-Themen 13
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
E Bäume/ allgemeine Fragen Java Basics - Anfänger-Themen 21
L Binären Bäume für beliebige Datentypen Java Basics - Anfänger-Themen 15
D Klausur Vorbereitung: Listen, Rekursion, Bäume & Vererbung Java Basics - Anfänger-Themen 3
M Bäume und Listener Java Basics - Anfänger-Themen 2
L 2-3-4 Bäume Konstruktor Java Basics - Anfänger-Themen 2
E Binäre Bäume Java Basics - Anfänger-Themen 7
W Bäume - containsValueRec Java Basics - Anfänger-Themen 2
R Crashkurs Listen / Bäume Java Basics - Anfänger-Themen 10
J bäume Java Basics - Anfänger-Themen 5
C Bäume in Java. Knoten in Array speichern Java Basics - Anfänger-Themen 3
C Bäume in Java. Code funktioniert nicht Java Basics - Anfänger-Themen 12
G Tertiäre Bäume Java Basics - Anfänger-Themen 2
G Bäume implementieren Java Basics - Anfänger-Themen 7
F Bäume in Java Java Basics - Anfänger-Themen 4
F Bäume zeichnen Java Basics - Anfänger-Themen 5
D n-näre Bäume (DOM) durchsuchen Java Basics - Anfänger-Themen 4
G Frage zur Bäume ? Java Basics - Anfänger-Themen 3
L [Aufgabe] Huffman Bäume Java Basics - Anfänger-Themen 10
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben