Baum nach Stack plus Objektkonvertierung

muckelzwerg

Bekanntes Mitglied
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
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?
 
S

SlaterB

Gast
die Queue nimmt genau Node-Elemente auf, um Nodes geht, die Children sind Nodes, alle happy?
keine Typumwandlung nötig,

was sollen Pop und Push sein, welchen Zweck haben die?
wo brauchst du warum Kopien und können diese Kopien nicht auch Nodes sein?
 

muckelzwerg

Bekanntes Mitglied
Die Push und Pop Elemente werden benötigt um später beim Zeichnen die Hierarchie zu bewahren.
Unter OpenGL würde das in glPushmatrix und glPopmatrx umgesetzt werden.
Stell Dir vor Du hast Wurzel "a" mit den Kindern "b c d" und unterhalb von "b" nochmal ein "e" und darunter nochmal "f g".
(sorry hab grad kein Bild)
Daraus würde ein Term der Form
" a [ b [ e [ f ] [ g ] ] ] [ c ] [ d ] "
werden.
Die "[" entsprechen dem Push und legen später bei der Ausführung eine Kopie des aktuellen Zustandes (Transformationsmatrix) auf den Stack.
Die "]" entsprechen dem Pop und entfernen die letzte Transformationsmatrix um den Zustand von vorher zu erreichen.
Ein einfacheres Beispiel: Wurzel "a" mit den Kindern "b c d" wird zu
a [ b ] [ c ] [ d ]
entspricht:
- zeichne a
- speichere den zustand
- zeichne b als direkten nachfahren
- lade den alten zustand
- speichere den zustand
- zeichne c als direkten nachfahren
...

Das entspricht im Wesentlichen der Turtle-Grafik.

Um die schließenden Klammern richtig zu platzieren müssen sie mit in die Queue aufgenommen und später kopiert werden.
Genaugenommen wird jeder Nachfahre geklammert, aber das ändert nicht viel am Code. (eine Schleife mehr)

Im Zielarray werden keine Nodes verarbeitet. Selbst wenn, müsste ich bei Push und Pop wieder basteln, weil das Zeichnungsoperatoren sind und keine echten Elemente des Baums.
 
S

SlaterB

Gast
falls in jedem Node eine Information abgelegt ist wie Tiefe von der Wurzel, dann spart das vielleicht diese Elemente

a hat Tiefe 1, das weiß man noch vom letzten Element, b hat Tiefe 2 -> dann gehört dazwischen wohl ein [,
c hat danach dieselbe Tiefe, dann müsste seit dem b ein ] und ein [ dazwischen gehören, usw.,
aber du willst ja keine Nodes speichern wie ich langsam genauer lese..

als weiteren Vorschlag überlege, Push und Pop als Nodes bzw. sonstige Objekte zu implementieren, als statische Konstanten:
if (actualNode == Node.PUSH) { .. }
das geht insbesondere auch wenn Node ein Interface ist, mal abgesehen davon dass die Konstanten dann in anderen Klassen definiert sein sollten,
auch wenn du letztlich keine Nodes sondern beliebige Objekte speicherst funktionieren die statischen Konstanten immer noch relativ komfortabel ohne Casts, aber dann wohl wirklich in einer einfachen ArrayList, Generics ist nicht so gut

du könnest auch null speichern, das wäre dann mit Generics kompatibel,
allein aus einer Zahl-Information, aus der Anzahl an null-Elementen zwischen zwei Einträgen ließe sich alle Information ableiten, oder?
1x null -> [
2x null -> ][
3x null -> ]][
usw.
 
Zuletzt bearbeitet von einem Moderator:

muckelzwerg

Bekanntes Mitglied
Generics will ich gar nicht verwenden. Ich hab die Typen nicht hingeschrieben, weil sie ja noch nicht feststehen.

Wir würdest Du die Konstanten implementieren, da blick ich noch nicht ganz durch, was Du meinst.

Die null-Variante finde ich nicht sonderlich "attraktiv". Aber trotzdem danke. :)
 
S

SlaterB

Gast
public static Object PUSH = new Object();
add(PUSH);
if (x == PUSH)
usw.

wenn es eine bestimmte Klasse wie Node sein soll, dann einen Konstruktor mit Dummy-Werten befüllen,
falls abstrakt oder Interface notfalls anonyme Klasse, alle Methoden Dummy-mäßig befüllen,
es ist egal was mit dem Objekt ist, hauptsache es kann mit == verglichen werden, ist eindeutig bestimmt,

falls im Konstruktor alle erstellten Objekte automatisch persistiert oder sonstwie verwaltet werden ist natürlich genauer aufzupassen,
wenn Konstruktor-Parameter direkt verwendet werden müssen es vielleicht mehrere Stufen sein:
public static Node PUSH = new Node(dummy, new Tree(dummy));
usw.,
die Object-Klasse ist da noch ziemlich komfortabel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Datentypen TreeMap nach Color sortiert (kd-Baum) Allgemeine Java-Themen 8
E XML - Datei Darstellung in IntelliJ als Baum Allgemeine Java-Themen 2
Karl_Der_Nette_Anfänger Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur) Allgemeine Java-Themen 11
D 2,3-Baum rekursiv erstellen Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
L Dependency Injection für Baum-Einträge Allgemeine Java-Themen 9
M Iterator für trinären Baum Allgemeine Java-Themen 0
N Rekursiv Höhe Baum Allgemeine Java-Themen 3
D Baum zeichnen hilfe Allgemeine Java-Themen 4
D if - else Baum vereinfachen Allgemeine Java-Themen 4
A AVL-Baum - Testen ob einer vorliegt Allgemeine Java-Themen 4
M Eclipse Stackoverflow beim Einlesen von großen Bilder in kd Baum Allgemeine Java-Themen 15
S Baum mit vordefinierten Werten befüllen Allgemeine Java-Themen 2
D Datenstruktur für Hierarchie/Baum mit Tiefe 3 Allgemeine Java-Themen 8
D Rot-Schwart-Baum denkfehler im code? Allgemeine Java-Themen 6
M Baum Allgemeine Java-Themen 3
K Dependency Baum erstellen/analysieren Allgemeine Java-Themen 2
J Baum mit Adjazensmatrix Allgemeine Java-Themen 8
MQue Tidy HTML baum durchlaufen Allgemeine Java-Themen 5
C Breitendurchlauf Baum. Vorgehen unklar. Allgemeine Java-Themen 23
C Fehler im Quellcode. Suche in einem Baum Allgemeine Java-Themen 3
R Daten aus Baum entsprechend in jTree einfuegen Allgemeine Java-Themen 2
C Daten möglichst schnell einem Baum zuordnen Allgemeine Java-Themen 2
S Datenstruktur für einen Baum Allgemeine Java-Themen 5
N Baum aus Datei laden. Allgemeine Java-Themen 3
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
M TicTacToe Sound nach jedem Zug Allgemeine Java-Themen 21
I HTML / XHTML Seite nach Excel exportieren. Suche Lib Allgemeine Java-Themen 12
J4n5chmiddi Methoden Website-URL im Browser öffnen nach erfolgreicher Basisauthentifizierung in Java Allgemeine Java-Themen 12
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
S Wörterliste nach Wörtern mit u durchsuchen und diese auf der Konsole ausgeben lassen Allgemeine Java-Themen 33
W Pdf verwerfen, weil Checkbox nach Unterschrift geaendert wurde Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
S Swing Speichern nach Button-Klick Allgemeine Java-Themen 5
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
M Java 8 nach Java 6 konvertieren Allgemeine Java-Themen 7
N Neustarten des Codes nach der Fehlermeldung Allgemeine Java-Themen 17
L Nach dem Login // Java Desktop Software Allgemeine Java-Themen 7
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J Jasper Reports - Compilerproblem nach Umstellung von Groovy auf Java Allgemeine Java-Themen 7
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
S Apache POI Filtern nach bestimmten Kriterium Allgemeine Java-Themen 1
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
C Config nach bestimmten Wertdurchsuchen. Allgemeine Java-Themen 2
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
F Zurnung nach Buchstaben und deren Prüfung Allgemeine Java-Themen 9
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
MiMa Sortieren nach Stellenangaben Allgemeine Java-Themen 7
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
J Ausgabe von Links nach Rechts ausgeben? Allgemeine Java-Themen 2
K JAR Datei Corrupt nach Kopieren Allgemeine Java-Themen 4
The Pi 2D-Grafik Tic Tac Toe nach Gewinn rot Allgemeine Java-Themen 1
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
L Suche nach CalDav Server API Allgemeine Java-Themen 0
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
T Textarea nach nur 1 wort durchsuchen Allgemeine Java-Themen 3
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
C Eclipse OutOfMemory nach dem exportieren Allgemeine Java-Themen 4
D Erste Schritte Array von einer forschleife nach ausserhalb trasferieren Allgemeine Java-Themen 3
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
B Umgebungsvariable Anpassen der Umgebungsvariablen nach Java-Update ? Allgemeine Java-Themen 14
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
E Java wird beendet nach paar Sekunden Allgemeine Java-Themen 14
H Best Practice setHeader in jsp nach RequestDispatcher.include Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
M .jar nach Datei prüfen Allgemeine Java-Themen 2
F String nach Schlüsselwörtern durchsuchen und ganze Zeile ausgeben Allgemeine Java-Themen 4
HarleyDavidson Input/Output Heruntergeladene Datei direkt nach dem Download öffnen ohne zu speichern Allgemeine Java-Themen 1
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
VfL_Freak JDK installieren Problem mit Erstellungspfad nach Wechsel von Java7 auf Java8 Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben