Hey Leute, ich hab ein kleines Schönheitsproblem und suche einen guten Tipp.
Ich habe einen Baum, der mehr oder weniger über die Java Treenodes implementiert ist.
"getChildren()" steht zur Verfügung, um die Nachfahren zu ermitteln.
Jetzt wandele ich diesen Baum in eine Folge von Stackanweisungen um, die dann später sequentiell ausgeführt werden (Zeichnen).
Die Stimme aus dem Off ruft sofort nach "Rekursion", die will ich aber nicht verwenden.
Also arbeite ich "wie man das halt so macht", mit einer Queue.
Grober Pseudocode
Grundsätzlich funktioniert die Tiefensuche natürlich. Es gibt allerdings zwei Problemchen.
Zum einen müssen die Objekte umgewandelt werden, weil die Listen unterschiedliche Typen benötigen.
Jedesmal wenn ein Objekt aus der Queue in das Zielfeld übertragen wird, findet eine Typumwandlung statt.
Soweit ok, allerdings muss ich ja auch die "Pop"-Elemente in die Liste übertragen. Das Push-Element kann ich direkt im passenden Typ hineinschieben. Das Pop-Element muss aber zuerst mal in die Queue, damit es später an der richtigen Stelle eingefügt wird.
Das gibt dann ein ziemlich ekliges Gebrösel mit unterschiedlichen Objekttypen in der Queue und blöden Fallunterscheidungen ob das Objekt konvertiert (normaler Knoten) wird und ob es Kinder besitzt (normaler Knoten) oder ob es einfach nur kopiert wird (Pop) ...
Kommt noch jemand mit? Wenn ja, habt ihr eine Idee, wie man das einigermaßen sauber zurechtbasteln kann?
Ich habe einen Baum, der mehr oder weniger über die Java Treenodes implementiert ist.
"getChildren()" steht zur Verfügung, um die Nachfahren zu ermitteln.
Jetzt wandele ich diesen Baum in eine Folge von Stackanweisungen um, die dann später sequentiell ausgeführt werden (Zeichnen).
Die Stimme aus dem Off ruft sofort nach "Rekursion", die will ich aber nicht verwenden.
Also arbeite ich "wie man das halt so macht", mit einer Queue.
Grober Pseudocode
Java:
public ArrayList createDecendentsList(Node root){
ArrayList destination = new ArrayList();
ArrayList queue = new ArrayList();
queue.add(root);
Enumeration children;
while( false == queue.isEmpty(){
Node node = queue.remove(0);
// Problemstelle 1
destination.add(node);
// Problemstelle 2
"destination.add(new Push());"
children = node.children();
queue.addAll(0, Collections.list(children));
// Problemstelle 3
"queue.add(new Pop());"
}
return destination;
}
Grundsätzlich funktioniert die Tiefensuche natürlich. Es gibt allerdings zwei Problemchen.
Zum einen müssen die Objekte umgewandelt werden, weil die Listen unterschiedliche Typen benötigen.
Jedesmal wenn ein Objekt aus der Queue in das Zielfeld übertragen wird, findet eine Typumwandlung statt.
Soweit ok, allerdings muss ich ja auch die "Pop"-Elemente in die Liste übertragen. Das Push-Element kann ich direkt im passenden Typ hineinschieben. Das Pop-Element muss aber zuerst mal in die Queue, damit es später an der richtigen Stelle eingefügt wird.
Das gibt dann ein ziemlich ekliges Gebrösel mit unterschiedlichen Objekttypen in der Queue und blöden Fallunterscheidungen ob das Objekt konvertiert (normaler Knoten) wird und ob es Kinder besitzt (normaler Knoten) oder ob es einfach nur kopiert wird (Pop) ...
Kommt noch jemand mit? Wenn ja, habt ihr eine Idee, wie man das einigermaßen sauber zurechtbasteln kann?