Hallo,
folgendes Problem, ich habe einen Binären-Baum programmiert wo an alle leeren zweige ein statisches NIL-Element gehängt wird damit keine nullPointerExceptions beim durchsuchen des Baums auftreten.
Jetzt möchte ich diesen Binären-Baum aber Serializieren, hier ist das Problem dass das NIL-Element nicht mit Serializiert wird sondern beim landen des Objekts einfach neu erzeugt wird, nun passen aber die vergleiche nicht mehr da ich nun beim durchgehen des Baums nach dem neu erzeugtem NIL abfrage jedoch das alte aber dran hängt, dieses endet natürlich in einer Endlosrekursion, und das Programm bricht wegen StackOverflow ab, da ein NIL-Element auf sich selbst verweist.
Kleiner Kodeschnipsel:
Hier ist die "findObject()" funktion die Kritische stelle, es wird quasi immer nach NIL1 abgefragt, man findet jedoch immer wieder NIL2.
Jetzt fallen mir spontan 2 lösungsansätze ein:
1. Man generiert das NIL-Element außerhalb und übergibt diesen dann an den Baum. Das NIL-Element wird dann immer als erstes Serializiert und auch als erstes geladen.
2. Man macht aus dem statischem NIL einen nicht statischen und versucht diesen irgendwie an andere Elemente weiter zu reichen.
Zu 1: Diese lösung scheint mir nicht wirklich gut zu sein da hier der Benutzer des BBaums erst wissen muss dass dieser einen NIL-Element anlegen muss.
Zu 2: Hier entsteht nun das Problem dass man von außen nciht wirklich gut auf das NIL-Element zugreifen kann, falls man noch zum späterem zeitpunkt überprüffen möchte ob man einen NIL-Element bekommen hat.
Wie löse ich nun das Problem geschickt? Im moment fällt mir da keine alternative lösung ein.
folgendes Problem, ich habe einen Binären-Baum programmiert wo an alle leeren zweige ein statisches NIL-Element gehängt wird damit keine nullPointerExceptions beim durchsuchen des Baums auftreten.
Jetzt möchte ich diesen Binären-Baum aber Serializieren, hier ist das Problem dass das NIL-Element nicht mit Serializiert wird sondern beim landen des Objekts einfach neu erzeugt wird, nun passen aber die vergleiche nicht mehr da ich nun beim durchgehen des Baums nach dem neu erzeugtem NIL abfrage jedoch das alte aber dran hängt, dieses endet natürlich in einer Endlosrekursion, und das Programm bricht wegen StackOverflow ab, da ein NIL-Element auf sich selbst verweist.
Kleiner Kodeschnipsel:
Java:
public class BBaum<E> implements Serializable{
public final static RBBaum NIL = new RBBaum(true);
private E root = null;
private RBBaum<E> parent = NIL;
private RBBaum<E> left = NIL;
private RBBaum<E> right = NIL;
private boolean color = RED;
/**
* Konstruktor für das "NIL" Element
*/
private RBBaum(Boolean _isNIL){
if(_isNIL){
this.parent = this;
this.left = this;
this.right = this;
this.color = BLACK;
}
}
/**
* Konstruktor, initialisiert die Wurzel.
* Dieser Konstruktor darf nur ein mal aufgeruffen werden.
* @param _root: Das Rootelement der Ebene
*/
public RBBaum(E _root) {
this.root = _root;
this.color = BLACK;
}
/**
* Konstruktor, initalisiert Elemente, jedoch nicht die Wurzel.
* Dieser Konstruktor sollte immer aufgeruffen werden, außer bei
* der Wurzel.
* @param _root: Das Rootelement der Ebene
* @param _parent: Elternelemend des Knotens
*/
private RBBaum(E _root, RBBaum<E> _parent) {
this.root = _root;
this.parent = _parent;
}
/**
* Sucht einen Objekt in dem baum,
* falls keiner gefunden wird, wird "NIL" zurückgegeben.
* @param _object
*/
public RBBaum<E> findObject(E _object){
if(_object.gleich(this.root)) return this;
else if(_object.kleiner(this.root) && this.left != NIL) return this.left.findObject(_object);
else if(_object.groesser(this.root) && this.right != NIL) return this.right.findObject(_object);
return NIL;
}
}
Hier ist die "findObject()" funktion die Kritische stelle, es wird quasi immer nach NIL1 abgefragt, man findet jedoch immer wieder NIL2.
Jetzt fallen mir spontan 2 lösungsansätze ein:
1. Man generiert das NIL-Element außerhalb und übergibt diesen dann an den Baum. Das NIL-Element wird dann immer als erstes Serializiert und auch als erstes geladen.
2. Man macht aus dem statischem NIL einen nicht statischen und versucht diesen irgendwie an andere Elemente weiter zu reichen.
Zu 1: Diese lösung scheint mir nicht wirklich gut zu sein da hier der Benutzer des BBaums erst wissen muss dass dieser einen NIL-Element anlegen muss.
Zu 2: Hier entsteht nun das Problem dass man von außen nciht wirklich gut auf das NIL-Element zugreifen kann, falls man noch zum späterem zeitpunkt überprüffen möchte ob man einen NIL-Element bekommen hat.
Wie löse ich nun das Problem geschickt? Im moment fällt mir da keine alternative lösung ein.