Binärbaum formatiert ausgeben.

jdnkr

Neues Mitglied
Ich knobel schon eine ganze Weile an einem Problem rum.
Ein Binärbaum soll erstellt werden und dann formatiert ausgegeben werden.
Das Erstellen ist auch kein Problem, nur bei der Ausgabe hapert es.

Soweit bin ich bis jetzt gekommen:
Java:
class Tree
{
    int wert ;
    Tree left, right ;
    Tree( int i, Tree l, Tree r ) { wert=i ; left=l ; right=r ; }
    void insert( int i )
    {      if ( i<=wert )
            if (left==null) left = new Tree( i , null , null ) ;
            else left.insert( i ) ;
        else
            if (right==null) right = new Tree( i , null , null ) ;
            else right.insert( i ) ;
    }
    void print()
    {
        if(right != null)
        {
            System.out.print("   ");
            right.print();
            System.out.println(wert);
        }
        if(left != null)
        {
            System.out.print("   ");
            left.print();
            System.out.println(wert);
        }
  }
}
public class P11
{
   public static void main( String[] args )
   {
    Tree t=new Tree( Integer.parseInt( args[0]), null, null ) ;
    for (int i=1; i<args.length ; i++)
        t.insert( Integer.parseInt( args[i])) ;
     t.print();
   }
}

Bei einer Eingabe von: java P11 4 5 1 7 7 3 9 4 1 2
sollte dann eine Ausgabe ungefähr so aussehen:
FRfmICl.jpg

aber ich bekomme nur das hier:
Lm34KnL.jpg


Schon mal im Vorraus vielen dank für jede Hilfe.
 

Meniskusschaden

Top Contributor
Ich sehe zwei Probleme. Zum Einen gibst du manche Werte gar nicht und manche doppelt aus. Da stimmen die Bedingungen noch nicht.
Zum Anderen verlierst du beim Ausgeben eines Wertes die Einrückung, weil es danach ja wieder am Zeilenanfang los geht. Du könntest beim Aufruf den gewünschten Abstand als Paramter übergeben und so rekursiv durchreichen. Vor dem Drucken des Wertes musst du dann nur noch in einer Schleife die entsprechende Anzahl von Leerzeichen ausgeben.
 
K

kneitzel

Gast
Also ein Algorithmus mit korrekter Einrückung ist nicht ganz so einfach zu realisieren. Die Einrückung, die notwendig ist, ist Abhängig von der Höhe des Teilbaums.
Und dann muss in eine Zeile ja Werte aus zwei Teilbäumen. Das ist nicht unmöglich, aber da müsste ich jetzt auch erst noch einen Algorithmus überlegen.

Was mir so durch den Kopf geht ist:
Die Print-Routine gibt immer ein String[] Array zurück.
Einen Baum auszugeben ist damit dann immer:
- linken und rechten Teilbaum drucken. Dadurch hat man dann zwei String[] arrays und damit auch die maximale höhe und ich würde evtl. sogar festlegen, dass jeder String die gleiche Länge hat.
==> So hat man dann die höhe und Breite der Teilbäume.
- den aktuellen Baum kann man dann ausgeben, indem man
a) Anzahl der Zeichen im linken Teilbaum - (Anzahl Ziffern Knoten / 2) + (Anzahl Zeichen Trenner / 2 ) an Leerzeichen + Zahl + ggf. Auffüllen Leerzeichen, so dass diese Zeile so lang ist, wie die anderen, die nun folgen werden.
b) Dann immer die Zeilen zusammenfügen: Linker Teilbaum + Trenner (z.B. " ") + rechter Teilbaum bzw. wenn die es einen Teilbaum nicht mehr gibt, dann halt Leerzeichen wie benötigt.
So hat man dann am Ende ein String[], das man ausgeben kann. Aber wirklich gut wird das nicht aussehen, denn ab einer bestimmten Größe sind die Zeichen recht weit voneinander entfernt. Evtl. trennt man die Teilbäume statt mit " " mit " || " oder so - dann hat man eine Trennung zwischen Teilbäumen.
 
K

kneitzel

Gast
Ach ja - Zwei Sonderfälle:
1) Keine Unterknoten: Da wird dann einfach ein String[] { wert.toString() } zurückgegeben.
2) Nur ein Unterknoten - da würde ich dann am Anfang die vorhandene Seite erstellen und dann würde ich die leere Seite durch Leerzeilen mit der gleichen Länge, wie es auf der anderen Seite war, füllen.

Also wenn rechts "123" war, dann würde ich links als " " sehen, so dass dann " || 123" als Ergebnis-Zeile erzeugen. Und da fällt schon etwas auf, dass || wohl nicht ganz so toll aussieht ... Was wir haben würden, wäre dann eine Ausgabe wie

Code:
   47
    || 123

Aber das muss man sich dann ansehen, wenn man es generieren läßt.
 

jdnkr

Neues Mitglied
Danke für die Antworten! Ich werde mich morgen wohl nochmal dransetzten, vielleicht kommt mir ja noch ein Geistesblitz.
 

Meniskusschaden

Top Contributor
Wenn ich den TE richtig verstanden habe, genügt es ihm, den Baum um 90 Grad gedreht auszugeben, also von links nach rechts statt von oben nach unten. Das ist deutlich einfacher (sieht aber wahrscheinlich nicht so toll aus). Das nur sicherheitshalber als Hinweis, damit die beiden Ansätze auseinander gehalten werden. Die "normale" Ausgabe von oben nach unten ist wirklich recht anspruchsvoll.
 
K

kneitzel

Gast
Um 90 Grad gedreht ist nicht viel einfacher meine Ich. Da müsste ich jetzt auch erst noch mehr nachdenken....
 

Meniskusschaden

Top Contributor
Wenn eine rudimentäre Version ohne Verbindungslinien genügt, ist der Algorithmus vom TE schon fast fertig. Die print-Methode könnte dann ungefähr so aussehen:
Java:
void print(int offset) {
    if(right != null) {
        right.print(offset+GAP_SIZE);
    }
  
    for (int i=0; i<offset;i++) {
        System.out.print(" ");
    }
    System.out.println(wert);
  
    if(left != null) {
        left.print(offset+GAP_SIZE);
    }      
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
D Binärbaum Blätter finden und Ausgeben Java Basics - Anfänger-Themen 22
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
E Erste Schritte Testklasse Binärbaum Java Basics - Anfänger-Themen 10
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
A Größten Eintrag aus Binärbaum löschen Java Basics - Anfänger-Themen 4
L Ganzen BinärBaum ausgeben? Java Basics - Anfänger-Themen 3
L Binärbaum (Stammbaum) Java Basics - Anfänger-Themen 8
S Binärbaum in PreOrder in ArrayList speichern Java Basics - Anfänger-Themen 0
J Methoden Binärbaum, Traversierung in Array speichern Java Basics - Anfänger-Themen 18
K BinärBaum Java Basics - Anfänger-Themen 4
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
C Binärbaum mit grafischer Ausgabe Java Basics - Anfänger-Themen 0
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
N Generischer Binärbaum - löschen Java Basics - Anfänger-Themen 1
M Binärbaum mit parent-Zeigern Java Basics - Anfänger-Themen 1
B Methoden BinärBaum als String Knoten löschen Java Basics - Anfänger-Themen 5
S Binärbaum kopieren Java Basics - Anfänger-Themen 6
B Binärbaum mit java implementieren! Java Basics - Anfänger-Themen 5
D Binärbaum Suche Java Basics - Anfänger-Themen 5
D Binärbaum probleme Java Basics - Anfänger-Themen 4
P Binärbaum - Primärschlüssel Java Basics - Anfänger-Themen 3
X Fehler Binärbaum Java Basics - Anfänger-Themen 6
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
P Binärbaum Ordnungsproblem Java Basics - Anfänger-Themen 8
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
P einen binärbaum implementieren Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B Binärbaum höhe herausfinden Java Basics - Anfänger-Themen 12
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
S Klassen Aufgabe: Binärbaum überprüfen Java Basics - Anfänger-Themen 16
S Binärbaum Java Basics - Anfänger-Themen 9
S Variable Parameterliste in Binärbaum Java Basics - Anfänger-Themen 2
N BinärBaum Hilfestellung Java Basics - Anfänger-Themen 8
S Binärbaum prüfen, ob sortiert oder unsortiert Java Basics - Anfänger-Themen 6
W Binärbaum zahlen addieren Java Basics - Anfänger-Themen 7
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
S Binärbaum Java Basics - Anfänger-Themen 7
I Binärbaum Java Basics - Anfänger-Themen 5
S Bitte um Hilfe beim unsortierten Binärbaum!! Java Basics - Anfänger-Themen 6
J Binärbaum getSize Java Basics - Anfänger-Themen 4
P Fragen zum Binärbaum Java Basics - Anfänger-Themen 3
S Binärbaum implementieren Java Basics - Anfänger-Themen 6
K Tiefe im Binärbaum Java Basics - Anfänger-Themen 2
G generischer binärbaum Java Basics - Anfänger-Themen 9
G Binärbaum und Wrapperklassen Java Basics - Anfänger-Themen 6
F Binärbaum codieren. Codeproblem! Java Basics - Anfänger-Themen 4
D rekursion im binärbaum Java Basics - Anfänger-Themen 11
0 Binärbaum als verkettete Liste Java Basics - Anfänger-Themen 3
T Binärbaum - noch ein "klitzekleiner Fehler" Java Basics - Anfänger-Themen 4
B Binärbaum auf Vollständigkeit prüfen Java Basics - Anfänger-Themen 15
G Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
G Binärbaum grafisch darstellen Java Basics - Anfänger-Themen 4
M Arrays auf Konsole formatiert ausgeben Java Basics - Anfänger-Themen 7
G Wie kann ich einem StringBuilder einen int Wert formatiert hinzufügen? Java Basics - Anfänger-Themen 8
W Arrays formatiert? Java Basics - Anfänger-Themen 3
H Interface JTextPane html formatiert kopieren Java Basics - Anfänger-Themen 2
S Beginner: Text formatiert speichern Java Basics - Anfänger-Themen 7
S Hex-String formatiert ausgeben! Java Basics - Anfänger-Themen 4
B int Array formatiert ausgeben Java Basics - Anfänger-Themen 2
J Date-Objekt formatiert als String ausgeben Java Basics - Anfänger-Themen 2
G Datum Formatieren vorher "19801120" formatiert &qu Java Basics - Anfänger-Themen 11
H Variablen formatiert in String kopieren Java Basics - Anfänger-Themen 9
G Markierte Buchstaben sollen formatiert werden Java Basics - Anfänger-Themen 5
K String in JTextfield formatiert ausgaben Java Basics - Anfänger-Themen 5
M Formatiert Drucken in Java Java Basics - Anfänger-Themen 3
I double-Wert formatiert ausgeben / Vector sortieren Java Basics - Anfänger-Themen 4
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
Glühlampe Usereingabe in der gleichen Zeile ausgeben Java Basics - Anfänger-Themen 6
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
H Minimum und Maximum ausgeben lassen Java Basics - Anfänger-Themen 7
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
javaBoon86 Arrays 2 Dimension Werte ausgeben Java Basics - Anfänger-Themen 15
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
S Vollmond berechnen und ausgeben Java Basics - Anfänger-Themen 12
S Vollkommene Zahl berechnen und ausgeben Java Basics - Anfänger-Themen 16
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
I Wortkette in umgekehrter Rheinfolge + in neuer Zeile ausgeben Java Basics - Anfänger-Themen 4
jeff98 Wie kann man in Java eine Zeichenformation ausgeben? Java Basics - Anfänger-Themen 9
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
Tommilee Char ausgeben Java Basics - Anfänger-Themen 5
K Geldbetrag in Euro + Cents ausgeben Java Basics - Anfänger-Themen 24
M geschachtelte for-Schleifen - Einmaleins ausgeben Java Basics - Anfänger-Themen 3
TheSepp Nur Arrays ausgeben, die Werte zugewiesen haben. Java Basics - Anfänger-Themen 4
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
I ResultSet aus meiner SQL-Abfrage in einem JTextfield ausgeben. Java Basics - Anfänger-Themen 1
M Werte in Felder speichern und geordnet ausgeben Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben