Binärbaum grafisch ausgeben

papabaer1707

Aktives Mitglied
Hallo, ich möchte (einfach) einen Binärbaum grafisch ausgeben. Mit einfach meine ich, dass ich dies lediglich zu Testzwecken, d. h. zum Testen verschiedener Operationen des ADT Baum, durchführen möchte. Zur Beurteilung des Problems dürfte folgendes wichtig sein:
1. Baum wurde erzeugt:
Code:
     myBinBaum.einfuegen(13);
     myBinBaum.einfuegen(8);
     myBinBaum.einfuegen(20);
     myBinBaum.einfuegen(10);
     myBinBaum.einfuegen(5);
2. Auf einem JPanel soll das Ganze gezeichnet werden:
Code:
public class MyCanvasPanelBinBaum extends JPanel {

  private BinBaum myBinBaum;
  private String[] contents;
  private int abstandX = 30; // vertikaler Abstand zwischen den Knoten
  private int abstandY = 20; // horizontaler Abstand zwischen den Knoten
  private int mitte;
  
  public MyCanvasPanelBinBaum(BinBaum aBinBaum) {
      this.myBinBaum = aBinBaum;
  }
  
  private void zeichneInOrder(Graphics g, BinKnoten knoten, int tiefe) {
        if (knoten != null) {
          zeichneInOrder(g,knoten.getLinks(),tiefe++);
          int pos = 0;
          while (knoten.getContent() != Integer.parseInt(contents[pos])) {
             pos++;
          }
          g.drawString(contents[pos],20+pos*abstandX,20+tiefe*abstandY);
          zeichneInOrder(g,knoten.getRechts(),tiefe++);
        }
  }

  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(new Color(255,255,255));
    g.fillRect(0,0,this.getWidth(), this.getHeight());
    
    String s = myBinBaum.inOrder();
    contents = myBinBaum.inOrder().split(" ");
    
    g.setColor(new Color(0,0,0));
    
    // Knoten ausgeben
    zeichneInOrder(g,myBinBaum.getWurzel(),0);
  }
}

3. Meine Grundidee besteht darin, die Inorder-Ausgabe (hier: "5 8 10 13 20 ") für die vertikale Position zu nutzen -> das funktioniert! Ein rekursiver Durchlauf soll dann in der entsprechenden Tiefe den Wert des Knotens ausgeben - das funktioniert nur zum Teil, d. h. ich erhalte folgendes Bild:

Code:
  5   8          13
            10         20

Wenn ich den Programmablauf verfolge stelle ich fest, dass der Wert für Tiefe sich nur für die rechten Teilbäume ändert, d. h. 5, 8 und 13 haben die Tiefe 1; 10 und 20 die Tiefe 2. Das kann ich mir nicht erklären ... hat da jemand eine Idee?
 
Zuletzt bearbeitet:
Ich werd verrückt. Damit funktioniert es:
Code:
zeichneInOrder(g,knoten.getLinks(),tiefe=tiefe+1);

Was ist der Unterschied zwischen tiefe++ und tiefe=tiefe+1? Und noch schlimmer: Darf das in dieser Stelle überhaupt stehen?
 
Bei tiefe++ wird ERST ausgewertet und DANN erhöht.

int a = 4;
System.out.println(a++); // Gibt 4 aus
System.out.println(a); // Gibt 5 aus
 

Zurück
Oben