Java Datenstruktur Bäume - entfernen() und toString() Methoden - Fehler ? - Rekursiv

Status
Für weitere Antworten geschlossen.

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.721
Guten Tag Community,

Ich habe da zwei Fragen zu meiner Aufgabe.
Ich finde leider nicht den Fehler, warum jeweils der Komplette Baum zerstört wird...
Beziehungsweise 'N'/'A' werden an die Stelle von 'M' gesetzt. Und da 'N' sowie 'A' ja keinen Nachfolger haben, wird der Baum komplett auf 'N' oder halt 'A' reduziert.

Die suchen, sowie auch die einfügen Methode funktioniert!
Hier mal der Baum:

Code:
                          M
                   /             \
                 D                T
               /   \            /   \
             B     E            R    W
           /                  /   \     \
         A                   N     S     X

Ich weiß, wenn ich jetzt beispielsweise T entferne, muss ich N an die Stelle von T packen.
Sollte N noch einen rechts Blatt besitzen, so muss ich S an die Stelle von N packen und dann N an die Stelle von T.

Wollte ich A löschen, so kann ich einfach den Linken Nachfolger von B auf 'null' setzten.
Doch wie geht das, bzw. wo liegt mein Fehler...
Ich müss das ganze Rekursiv implementieren. Daher weiß ich auch nicht so ganz, wie ich dann immer an den Vorgänger kommen soll...

Wir haben als Attribut in Klasse Baum 'löschenPosition' und 'wurzel'.
Hier mal meine entfernen Methode:
Code:
	public void entfernen(char schluessel) {
		entfernenAusKnoten(schluessel, wurzel);
	}

	private Knoten entfernenAusKnoten(char schluessel, Knoten knoten){
		
		if(knoten.getSchluessel() < schluessel){ //RECHTS
			if(knoten.getSchluessel() == schluessel && knoten.getLinkerKnoten() == null && knoten.getRechterKnoten() == null){
				Knoten vorgeanger_rechterKnoten = wurzel.getRechterKnoten();
				Knoten vorgeanger_linkerKnoten = wurzel.getLinkerKnoten();
				
				setWurzel(knoten);
				wurzel.setLinkerKnoten(vorgeanger_linkerKnoten);
				wurzel.setRechterKnoten(vorgeanger_rechterKnoten);
			
				return new Knoten(schluessel);
			}
			else if(knoten.getSchluessel() == schluessel && knoten.getLinkerKnoten() != null && knoten.getRechterKnoten() == null){
				Knoten vorgeanger_linkerKnoten = wurzel.getLinkerKnoten();
				
				loeschePosition = knoten;
				setWurzel(knoten);
				knoten = vorgeanger_linkerKnoten;
				
				return new Knoten(schluessel);
				
				}else{
					entfernenAusKnoten(schluessel, knoten.getRechterKnoten());
				}	
			
			// -------------------------------------------------------------------------------------------------------------
			
		}else{ //LINKS
			if(knoten.getSchluessel() == schluessel && knoten.getLinkerKnoten() == null && knoten.getRechterKnoten() == null){
				Knoten vorgeanger_rechterKnoten = wurzel.getRechterKnoten();
				Knoten vorgeanger_linkerKnoten = wurzel.getLinkerKnoten();
				
				setWurzel(knoten);
				wurzel.setLinkerKnoten(vorgeanger_linkerKnoten);
				wurzel.setRechterKnoten(vorgeanger_rechterKnoten);
			
				return new Knoten(schluessel);
			}
			else if(knoten.getSchluessel() == schluessel && knoten.getLinkerKnoten() == null && knoten.getRechterKnoten() != null){
				Knoten vorgeanger_rechterKnoten = wurzel.getRechterKnoten();
				
				loeschePosition = knoten;
				setWurzel(knoten);
				knoten = vorgeanger_rechterKnoten;
				
				return new Knoten(schluessel);
				
				}else{
					entfernenAusKnoten(schluessel, knoten.getLinkerKnoten());
				}		
			}
		
		return null;	
	}

Meine zweite Frage ist noch, wie kann ich auf der Konsole so einen Baum, wie ich oben manuell geschrieben habe, ausgeben lassen?

MfG und Danke!
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben