Datentypen Einfügen im RotSchwarz Baum

dj3nk

Mitglied
Anbei meine beiden Klassen Cnode und RbTree.

Kurz gesagt geht soweit alles, nur das beim Einfügen ab und an Knoten "verloren gehen". Ich hab jetzt schon über 2 Stunden nur den Fehler gesucht, aber nicht gefunden. Ich hoffe jmd von euch kann mir nochmal helfen :/.

Cnode.java
Java:
/**
 * Klasse Cnode.java (colored node)
 *  
 * @author  Andreas Jenkuhn
 * @version 0.1
 * @date   20.März 2010
 * @Repräsentiert einen Knoten im Rot-Schwarz Baum
 *
 * ----------------------------------------------------------------------------- 
 * @KONSTRUKTOREN: 
 * Cnode() 							=> erzeugt einen schwarzen nil-Knoten //
 * Cnode(Object key)				=> erzeugt einen roten Knoten mit key=inhalt //
 * Cnode(Object key, Object data)	=> erzeugt einen roten Knoten mit key und inhalt //
 * ----------------------------------------------------------------------------- 
 * @ATTRIBUTE (alle private): 
 * Cnode left, right				=> linkes, rechtes Kind des Knotens //
 * boolean red, black				=> mit red!=black //
 * Object key, data					=> Key und Inhalt des Knotens //
 * ----------------------------------------------------------------------------- 
 * @METHODEN: 
 * getKey()							=> return Object key //
 * getData()						=> return Object data //
 * setData(Object o)				=> set data //
 * getLeft()						=> return linker Kindsknoten //
 * setLeft(Cnode n)					=> set linker Kindsknoten //
 * getRight()						=> return rechter Kindsknoten //
 * setRight(Cnode n)				=> set rechter Kindsknoten //
 * isRed()							=> return boolean red //
 * isBlack()						=> return boolean black //
 * getColor()						=> return String 'red' oder 'black' //
 * isNil()							=> return boolean //
 * toString()						=> return '(Black(key)-(data))'
 * 											  '(Red(key)-(data))'
 * 											  '[Black][nil]' 
 * -----------------------------------------------------------------------------
 */

public class Cnode {

	private Cnode left,right;
	private boolean red, black, nil;
	private Object key, data;
	
	/**
	 * Standardkonstruktor Cnode()
	 * erzeugt einen nil-Knoten
	 */
	public Cnode() {
		this.nil = true;
		setBlack();
	}
	
	/**
	 * Konstruktor Cnode(Object key)
	 * 
	 * @param Object key - Schlüssel + Inhalt des neuen Knotens
	 */
	public Cnode(Object key) {
		this(key,key);					// erstelle Knoten mit key=data
	}	
	
	/**
	 * Konstruktor CNode(Object key, Object data)
	 * 
	 * @param Object key - Schlüssel des neuen Knotens
	 * @param Object data - Inhalt des neuen Knotens
	 */
	public Cnode(Object key, Object data) {
		this.nil = false;				// ist kein nil mehr
		setRed();						// ist beim einfügen rot
		this.key = key;
		this.data = data;
		left = new Cnode();				// nil als linkes Kind
		right = new Cnode();			// nil als rechtes Kind
	
	}

	/**
	 * Methode getData()
	 *  
	 * @return Object - übergibt Inhalt des Knoten
	 */
	public Object getData() {
		return data;
	}

	/**
	 * Methode setData()
	 * 
	 * @param Object data - Inhalt des Knoten als Object
	 */
	public void setData(Object data) {
		this.data = data;
	}

	/**
	 * Methode getKey()
	 * 
	 * @return Object - übergibt Key des Knoten
	 */
	public Object getKey() {
		return key;
	}

	/**
	 * Methode getLeft()
	 * 
	 * @return Cnode - übergibt linken Kindsknoten
	 */
	public Cnode getLeft() {
		//kein nil? dann links weitergeben
		if (!nil) return left;
		// Falls man das Kind eines nil-Knoten erfragt
		// wird zur Vermeidung einer null-Rückgabe
		// ein nil-Knoten übergeben
		else return new Cnode();
	}

	/**
	 * Methode setLeft()
	 * 
	 * @param n - Knoten welcher linkes Kind werden soll
	 * @return	boolean - ob anfügen erfolgerich war
	 */
	public boolean setLeft(Cnode n) {
		// übergibt ob Knoten erfolgreich angehängt wurde
		// Man kann nur an einen Knoten anhängen,
		// wenn der aktuelle Knoten kein nil-Knoten ist
		if (!nil) this.left = n;	else return false;
		return true;
	}
	
	/**
	 * Methode getRight()
	 * 
	 * @return Cnode - übergibt rechten Kindsknoten
	 */
	public Cnode getRight() {	
		//kein nil? dann return rechtes Kind
		if (!nil) return right;
		// Falls man das Kind eines nil-Knoten erfragt
		// wird zur Vermeidung einer null-Rückgabe
		// ein nil-Knoten übergeben
		else return new Cnode();
	}

	/**
	 * Methode setRight()
	 * 
	 * @param n - Knoten welcher rechtes Kind werden soll
	 * @return	boolean - ob anfügen erfolgerich war
	 */
	public boolean setRight(Cnode n) {	 
		// übergibt ob Knoten erfolgreich angehängt wurde
		// Man kann nur an einen Knoten anhängen,
		// wenn der aktuelle Knoten kein nil-Knoten ist
		if (!nil) this.right = n;	else return false;
		return true;
	}
	
	/**
	 * Methode setBlack()
	 * 
	 * färbt Knoten schwarz
	 */
	public void setBlack() {
		this.black = true;
		this.red = false;
	}
	
	/**
	 * Methode setRed()
	 * 
	 * färbt Knoten rot
	 */
	public void setRed() {
		this.black = false;
		this.red = true;
	}
	
	/**
	 * Methode isRed()
	 * 
	 * @return boolean - Knoten rot?
	 */
	public boolean isRed() {
		return red;
	}
	
	/**
	 * Methode isBlack()
	 * 
	 * @return boolean - Knoten schwarz?
	 */
	public boolean isBlack() {
		return black;
	}

	/**
	 * Methode isNil()
	 * 
	 * @return boolean - ein nil-Knoten?
	 */
	public boolean isNil() {
		return nil;
	}
	
	/**
	 * Methode getColor()
	 * 
	 * @return String - Farbe des Knotens
	 */
	public String getColor() {
		if (red) return "Red"; 
		else return "Black";
		}

	/**
	 * Methode compareTo()
	 * 
	 * @param Cnode n - Knoten mit dem verglichen werden soll
	 * @return -1, 0, 1 wenn kleiner, gleich, grösser
	 */
	public int compareTo(Object m) {
//		// Vergleich nach keys der Knoten
//		Object obj = m.getKey();
//
//		System.out.println("m: " + m.getClass());
//		
//		System.out.println("m.getKey(): " + (m.getKey().getClass()));
		
		return ((Comparable)key).compareTo((Comparable)(((Cnode)m).getKey()));
	}
	
	/**
	 * Methode toString()
	 * 
	 * @return String - "(Farbe(Schlüssel)-(Inhalt))" bzw. "[nil]"
	 */
	public String toString() {
		if (!nil) return "(" + getColor() 
					   + "(" + data.toString() + ")-" 
					   + "(" + key.toString() + "))";
		else return "[" + getColor() + "][nil]";
	}
}

RbTree.java
Java:
public class RbTree {
	private Cnode root;
	private Cnode child, parent, grand, luncle, runcle, n;
	private String temp;
	
	private static RbTree tree;

	public RbTree(Cnode root) {
		this.root = root; // Am Anfang kommt die Wurzel
		this.root.setBlack(); // und die ist schwarz
	}

	public boolean searchKey(Cnode tempNode, Object key) {
		Cnode temptemp = new Cnode(key);
		child = tempNode;
		boolean found = false;

		if (tempNode.getKey().equals(key))
			return true;
		else {
			if ( temptemp.compareTo(tempNode) < 0) {

				if (!child.getLeft().isNil())
					found = searchKey(child.getLeft(), key);
			} else { // k > tempRoot
				if (!child.getRight().isNil())
					found = searchKey(child.getRight(), key);
			}
			if (found) {
				if ( tempNode.getLeft().equals(child) || tempNode.getRight().equals(child)  ) {
					parent = tempNode;
				}
				if ( tempNode.getLeft().equals(parent) ) {
					grand = tempNode;
					luncle = null;
					runcle = tempNode.getRight();
				}
				if ( tempNode.getRight().equals(parent) ) {
					grand = tempNode;
					luncle = tempNode.getLeft();
					runcle = null;
				}
			}
			return found;
		}
	}
	
	
	public boolean insert(Object key) {
		n = new Cnode(key);
		if (searchKey(root, key)) {
			System.out.println("--> key gefunden!");
			return false;							// einfügen erfolglos da schon vorhanden
		}
		if ( n.compareTo(child)  < 0 )  			// n < child
			child.setLeft(n);						// d.h. n nach links
		else 
			child.setRight(n);
		while (repairNode(n)) repairNode(grand);	// repariere rekursiv bis false kommt (false=keine Reperatur mehr)
		return true;		
	}

	private boolean repairNode(Cnode n) {
		searchKey(root, n.getKey());				// initialisiere die Familienknoten
		if ( case1(n) || case2(n) || case3(n) || case4(n) || case5(n) ) return true;
		return false;
	}
	
	private boolean case1(Cnode n) {				// Knoten ist Wurzel
		if (n==root) {
			root.setBlack();
			return false;							// da Wurzel, trotz Reparatur kein true mehr nötig
		}
		return false;								// als Entscheidung zur weiteren Kontrolle eines Knoten
	}

	private boolean case2(Cnode n) {	// Vaterknoten ist schwarz
		return false;
		// Fall 2 ist für einen schwarzen Vater. Dann ist nichts zu machen.
		// Da alle Fälle eines roten Vaters woanders geprüft werden ist diese
		// Methode "abstrakt" und returnt immer false und ist nur der Übersichtlichkeit
		// halber enthalten.
	}

	private boolean case3(Cnode n) {	// Vater & Onkel sind rot
		if (parent!=null && parent.isRed() && runcle!=null && runcle.isRed()) {
			parent.setBlack();
			runcle.setBlack();
			grand.setRed();
			return true;
		}
		if (parent!=null && parent.isRed() && luncle!=null && luncle.isRed()) {
			parent.setBlack();
			luncle.setBlack();
			grand.setRed();
			return true;
		}
		return false;
	}
	
	private boolean case4(Cnode n) {	// Kind ist rechts vom roten Vater und dieser links vom Opa. Kein oder schwarzer Onkel
		if (parent!=null && runcle!=null && parent.isRed() && runcle.isBlack() && (n == parent.getRight()) ) {
			rol(parent);
			case5(parent);
			return true;
		}								// Kind ist links vom roten Vater und dieser rechts vom Opa. Kein oder schwarzer Onkel
		if (parent!=null && luncle!=null && parent.isRed() && luncle.isBlack() && (n == parent.getLeft()) ) {
			ror(parent);
			case5(parent);
			return true;
		}
		return false;
	}
	
	private boolean case5(Cnode n){		// Kind ist links vom roten Vater und dieser ist rechts vom Opa. Kein oder schwarzer Onkel.
		if (parent!=null && runcle!=null && parent.isRed() && runcle.isBlack()  && (n == parent.getLeft())) {
			ror(grand);
			parent.setBlack();
			grand.setRed();
			return true;
		}								// Kind ist rechts vom roten Vater und dieser ist links vom Opa. Kein oder schwarzer Onkel.
		if (parent!=null && luncle!=null && parent.isRed() && luncle.isBlack()  && (n == parent.getRight())) {
			rol(grand);
			parent.setBlack();
			grand.setRed();
			return true;
		}
		return false;
	}
	
	// Linksrotation
	private void rol(Cnode n) {
		if (n==root) root = n.getRight();
		Cnode oldRight;
		oldRight = n.getRight();
		n.setRight(oldRight.getRight().getLeft());
		oldRight.setLeft(n);
	}

	// Rechtsrotation
	private void ror(Cnode n) {
		if (n==root) root = n.getLeft();
		Cnode oldLeft;
		oldLeft = n.getLeft();
		n.setLeft(oldLeft.getLeft().getRight());
		oldLeft.setRight(n);
	}
	
	public String toString() {
		temp = "";
		return (toString(root));
	}

	// Inorderausgabe des Baumes
	public String toString(Cnode tempNode) {
		if (!tempNode.getLeft().isNil())
			toString(tempNode.getLeft());

		temp += "\n" + tempNode.toString();

		if (!tempNode.getRight().isNil())
			toString(tempNode.getRight());

		return temp;
	}

	// /////////////////////////////////////////////////////////////////////////////////////
	private void start() {
		// TESTS TESTS TESTS
		System.out.println("1");
		System.out.println(tree.toString());
		
		tree.insert(new Integer(50));
		System.out.println("root: " + root);
		System.out.println(tree.toString());	

		tree.insert(new Integer(30));
		System.out.println("root: " + root);
		System.out.println(tree.toString());
		
		tree.insert(new Integer(10));
		System.out.println("root: " + root);
		System.out.println(tree.toString());
		
		System.out.println("2");
		
		n = new Cnode(new Integer(20));
		tree.insert(new Integer(20));
		System.out.println("node: " + n);
		System.out.println(tree.toString());
		
		tree.insert(new Integer(60));
		System.out.println("root: " + root);
		System.out.println(tree.toString());	
		
		System.out.println("3");
		System.out.println(searchKey(root, 20));
		System.out.println("4");
	}
	
	public static void main(String[] args) {
		tree = new RbTree(new Cnode(40));
		try {
			tree.start();
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

Ich wäre für eure Hilfe echt Dankbar, schreibe in ein par Tagen eine Klausur und möchte mich nicht ewig hieran aufhalten müssen weil ich vor lauter Bäumen den Wald nimmer seh ;P.

In diesem Fall verschwindet das Element 20. oO

Grüsse an alle freaks da draussen :D
 
S

SlaterB

Gast
der Fehler liegt in
Java:
    private void rol(Cnode n) {
        if (n==root) root = n.getRight();
        Cnode oldRight;
        oldRight = n.getRight();
        n.setRight(oldRight.getRight().getLeft());
        oldRight.setLeft(n);
    }
der rechte Nachfolger (oldRight) von n soll nach oben rücken, n selber linker Nachfolger von oldRight werden,
soweit klappt das wahrscheinlich auch, aber du hast nicht bedacht, den Baum weiter oben zu korrigieren,
wer von oben auf n zeigt, tut das danach immer noch, die Referenz muss aber auf oldRight umgebogen werden
 

dj3nk

Mitglied
bo1nG !!!!


Das wirds dann natürlich sein. Klar, ich muss ja auch die Referenz von oben her korriegeren. Ich werd das gleich mal einhacken und dann testen =D

Vielen vielen Dank, mir war wieder mal klar das irgendwo so ein kleiner aber erheblicher Fehlerteufel stecken muss.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
melaniemueller setCharAt Leerzeichen zusätzlich einfügen Java Basics - Anfänger-Themen 8
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
E In Array Werte einfügen? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Gaudimagspam Attribute einfügen private Java Basics - Anfänger-Themen 3
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
R Inventar und Items auf ein 2D ArrayFeld einfügen Java Basics - Anfänger-Themen 2
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
V_Fynn03 Erste Schritte Einen Wert in ein TextField einfügen aus einer anderen Klasse Java Basics - Anfänger-Themen 3
E Datentypen Einfügen von Objekten in eine Map Java Basics - Anfänger-Themen 2
O Naives links rechts einfügen in ADT Baum Java Basics - Anfänger-Themen 8
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
M Klasse in JTable einfügen Java Basics - Anfänger-Themen 7
J In einer Klasse ein AlertDialog einfügen Java Basics - Anfänger-Themen 4
S Elemente in Liste einfügen Java Basics - Anfänger-Themen 2
S Interface (WindowBuilder) Panels in einen Frame einfügen Java Basics - Anfänger-Themen 10
x-tshainge Java Bilder einfügen Java Basics - Anfänger-Themen 1
T Variablen “ in String einfügen Java Basics - Anfänger-Themen 1
Orkanson Objekte in ein Array einfügen Java Basics - Anfänger-Themen 5
S Doppelte Liste Einfügen Java Basics - Anfänger-Themen 1
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
jaleda100 JTextArea Zeile einfügen Java Basics - Anfänger-Themen 1
R Spielfeldbegrenzung einfügen (Java)? Brauche Hilfe! Java Basics - Anfänger-Themen 15
D B-Baum einfügen und löschen Java Basics - Anfänger-Themen 2
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
JavaNewbie2.0 Tausende Wörter in Arrays automatisch einfügen Java Basics - Anfänger-Themen 10
J Wie kann ich Images per Tastendruck anzeigen/einfügen? Java Basics - Anfänger-Themen 3
F In LinkedList einen Wert ersetzen oder neu einfügen Java Basics - Anfänger-Themen 7
C Verkettete Liste - sortiert einfügen Java Basics - Anfänger-Themen 7
J Scroll-Leiste einfügen Java Basics - Anfänger-Themen 12
U Sound einfügen Java Basics - Anfänger-Themen 6
P String zerstückeln und in Excel einfügen Java Basics - Anfänger-Themen 11
J Objecte in TreeSet einfügen klappt nicht Java Basics - Anfänger-Themen 5
P Variablen Wie kann ich eine lokale Variable in eine andere Methode einfügen? Java Basics - Anfänger-Themen 27
S Bild einfügen Java Basics - Anfänger-Themen 16
D Taschenrechnerereignisse einfügen Java Basics - Anfänger-Themen 18
B Vererbung In offener Hash Tabelle einfügen Java Basics - Anfänger-Themen 4
W Listenelement einfügen Java Basics - Anfänger-Themen 9
P OOP Eingabevariablen der Klasse Raum in der Methode addEvent ans Ende einer ArrayList einfügen Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
D Datenbankzugriff - Leere Zeile einfügen Java Basics - Anfänger-Themen 2
GadgetSofa IOException fehlt aber wo einfügen? Java Basics - Anfänger-Themen 6
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
A Objekte in eine Liste einfügen Java Basics - Anfänger-Themen 7
J Methoden Einfügen von Objekten nach Alphabet in ArrayList funktioniert nicht Java Basics - Anfänger-Themen 2
S jList --> Array einfügen und Liste löschen Java Basics - Anfänger-Themen 5
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1
C Kalender in Applet einfügen Java Basics - Anfänger-Themen 0
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
F Collections Sortierung und Einfügen von Elementen Java Basics - Anfänger-Themen 1
K Erste Schritte Classe in andere Einfügen?? Java Basics - Anfänger-Themen 12
P Klasse in Klasse einfügen (arrayliste) Java Basics - Anfänger-Themen 7
F Bibliotheken einfügen ??? Java Basics - Anfänger-Themen 2
P Hintergrundbild in Swing einfügen Java Basics - Anfänger-Themen 3
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
K JTextField in ein Spiel einfügen Java Basics - Anfänger-Themen 2
Q Erste Schritte In CharArrayWriter Zeichen an Stelle einfügen Java Basics - Anfänger-Themen 4
J Daten in eine JList einfügen Java Basics - Anfänger-Themen 6
J Neue Zeile an bestimmter Stelle in Textdatei einfügen Java Basics - Anfänger-Themen 2
D Durch Button klick wert in JTextField einfügen Java Basics - Anfänger-Themen 5
J Button in extra Klasse festlegen und in anderer Klasse einfügen? Java Basics - Anfänger-Themen 3
J GUI Button Klasse in anderer Klasse einfügen Java Basics - Anfänger-Themen 3
E HILFE Projekt für die Schule--> Bilder einfügen Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
D String aus txt in label für Tabelle einfügen Java Basics - Anfänger-Themen 8
A Aktuelles Datum einfügen.. Java Basics - Anfänger-Themen 4
I fertige xml-datein in eine noch aufzubauende xml-datei einfügen Java Basics - Anfänger-Themen 4
N JTable - Zellfarben ändern, GUI-Komponenten in Zellen einfügen Java Basics - Anfänger-Themen 5
B Ordner in jar dateien einfügen Java Basics - Anfänger-Themen 4
S Erste Schritte Bluej Automatisches Einfügen von Objekten Java Basics - Anfänger-Themen 4
A String aus anderer Klasse in JTextArea einfügen Java Basics - Anfänger-Themen 7
J Bild einfügen Java Basics - Anfänger-Themen 3
S Musik einfügen funktioniert noch nicht Java Basics - Anfänger-Themen 6
K paint() mit einfügen Java Basics - Anfänger-Themen 14
A Sortiertes Einfügen in Liste Java Basics - Anfänger-Themen 2
B org.apache.commons.... Folder in Projekt einfügen Java Basics - Anfänger-Themen 6
Kenan89 String in ObjectList einfügen Java Basics - Anfänger-Themen 2
H Bilder im GUI einfügen Java Basics - Anfänger-Themen 12
A SwingX in Eclipse einfügen Java Basics - Anfänger-Themen 5
B Einfügen von Dateien Java Basics - Anfänger-Themen 10
M Java String " einfügen Problem Java Basics - Anfänger-Themen 2
M Video in ClassLoader einfügen Java Basics - Anfänger-Themen 7
S Itext und eine neue Zeile einfügen Java Basics - Anfänger-Themen 2
P JPanel in JTable einfügen Java Basics - Anfänger-Themen 23
D Werte aus Excel in Diagramm einfügen Java Basics - Anfänger-Themen 6
K Fehler beim Einfügen eines Programm Icons Java Basics - Anfänger-Themen 6
Binary.Coder Vor und nach jeder Codezeile etwas einfügen Java Basics - Anfänger-Themen 3
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
D Input/Output Zeilen aus txt-datei in Java-Liste einfügen Java Basics - Anfänger-Themen 9
J JPG in einem Label einfügen und anzeigen lassen Java Basics - Anfänger-Themen 2
T Bild in JFrame einfügen Java Basics - Anfänger-Themen 2
L Element in Mitten eines Arrays einfügen Java Basics - Anfänger-Themen 3
S an bestimmter stelle löschen / einfügen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben