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:
2. Auf einem JPanel soll das Ganze gezeichnet werden:
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:
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?
1. Baum wurde erzeugt:
Code:
myBinBaum.einfuegen(13);
myBinBaum.einfuegen(8);
myBinBaum.einfuegen(20);
myBinBaum.einfuegen(10);
myBinBaum.einfuegen(5);
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: