Binärbaum ohne Überlappung zeichnen

Status
Nicht offen für weitere Antworten.

MyPiano

Mitglied
Hallo,

ich habe eine Klasse geschrieben, die einen Binärbaum erzeugt. Das klappt alles prima. Das ganze möchte ich jetzt noch visualisieren, also als Grafik ausgeben. Die Grundstruktur sieht gut aus, nur leider überlappen sich einige Knoten (siehe Bild im Anhang).

Meine Methode zum zeichnen sieht bisher wie folgt aus:

Code:
public class BinaryTree {

    private Integer content = null;
    private BinaryTree left = null;
    private BinaryTree right = null;

   //....

      public void drawBinaryTree(Graphics painter, int x, int y) {
        if (content != null) {
            painter.drawRect(x, y, 40, 30);
            painter.drawString(Integer.toString(content), x + 7, y + 21);
            painter.drawLine(x + 20, y + 30, x - 65, y + 50);
            painter.drawLine(x + 20, y + 30, x + 100, y + 50);
            if (left != null) {
                //  painter.drawRect(x-85, y+50, 40, 30);
                left.drawBinaryTree(painter, x - 85, y + 50);
            } else {
                painter.drawRect(x - 85, y + 50, 40, 30);
                painter.drawString("Null", x - 78, y + 71);
            }
            if (right != null) {
//                painter.drawRect(x+80, y+50, 40, 30);
                right.drawBinaryTree(painter, x + 80, y + 50);
            } else {
                painter.drawRect(x + 80, y + 50, 40, 30);
                painter.drawString("Null", x + 87, y + 71);
            }
        } else {
            painter.drawRect(x, y, 40, 30);
            painter.drawString("Null", x + 7, y + 21);
        }
    }
}

Hat jemand eine Idee, wie ich diesen Fehler beheben kann?

Viele Grüße

MyPiano
 

Anhänge

  • binärbaum.jpg
    binärbaum.jpg
    48,5 KB · Aufrufe: 102

Marco13

Top Contributor
Im wesentlichen würden mir da zwei Möglichkeiten einfallen:
1. Entweder die oberen Knoten weiter auseinander zeichnen als die Unteren oder
2. Die unteren dichter zusammen zeichnen als die oberen :D
Alles weitere würde vmtl. auf irgendwelche "komplexeren" Baumlayoutalgorithmen rauslaufen
 

slawaweis

Bekanntes Mitglied
ich habe eine Klasse geschrieben, die einen Binärbaum erzeugt. Das klappt alles prima. Das ganze möchte ich jetzt noch visualisieren, also als Grafik ausgeben. Die Grundstruktur sieht gut aus, nur leider überlappen sich einige Knoten (siehe Bild im Anhang).

...

Hat jemand eine Idee, wie ich diesen Fehler beheben kann?
der schnellste Weg wäre sich ein TreeModel abzuleiten und das ganze in einen JTree zu werfen, wo man dann alle Knoten expandiert. So muss man such nicht um die Grafik kümmern, höchstens um einen CellRenderer.

Der harte Weg führt über den folgenden Algorithmus. Zuerst wird der Baum in eine Zeilenform überführt, alle Knoten in einer Ebene werden zu einer Zeile zusammengefasst. D.h. der Wurzelknoten ist in der ersten Zeile, die Kinder des Wurzelknoten in der zweiten, die Kindeskinder in der dritten und so weiter. So könnte es am Ende aussehen:

Code:
 Object [][] zeilen_darstellung = {

  {root},
  {root_lkind, root_rkind},
  {root_lkind_lkind, root_lkind_rkind, root_rkind_lkind, root_rkind_rkind},
  // ...
 };

jetzt muss man den Baum nur noch Zeile für Zeile zeichnen und dabei die Abstände zwischen den Konten anhand einer Zeile ausrechnen.

Slawa
 

MyPiano

Mitglied
Hallo ihr beiden,

vielen dank für eure Tipps. Ich denke, ich werde den ersten Tipp ausprobieren, da er am einfachsten ist und für meine Zwecke völlig ausreicht.

Viele Grüße

MyPIano
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Programmierung eines 2.5D Point&Click Adventures ohne Spieleengine machbar? Spiele- und Multimedia-Programmierung 14
J Bild ohne Quallitätsverlust skalieren Spiele- und Multimedia-Programmierung 11
E Rotation um Bildmittelpunkt ohne Affine Transform!!!!! Spiele- und Multimedia-Programmierung 13
A 2D Spiel ohne Tiles Spiele- und Multimedia-Programmierung 10
S Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren Spiele- und Multimedia-Programmierung 6
B Bild ohne Image auf die Festplatte streamen Spiele- und Multimedia-Programmierung 4
Devil0s 2D Stadt Generator/2D Welt speichern OHNE Tiles Spiele- und Multimedia-Programmierung 5
H zwei ints als key in map (ohne long) Spiele- und Multimedia-Programmierung 16
M Multiplayer Game mit Frontend auf HTML5 - ohne ständigen Client Request - Möglich?! Spiele- und Multimedia-Programmierung 12
S Sounds abspielen, ohne sie jedesmal neu zu laden Spiele- und Multimedia-Programmierung 8
B Bilder in GUI ändern ohne repaint() Spiele- und Multimedia-Programmierung 6
C java 3d ohne Java3d Spiele- und Multimedia-Programmierung 28
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
K Java3D als Applet ohne Installation von Java3d Spiele- und Multimedia-Programmierung 6
M Eigene Renderengine ohne Java3D,etc. Spiele- und Multimedia-Programmierung 19
M Aktien-Spiel ohne GUI Spiele- und Multimedia-Programmierung 28
aze Java3D: Gegenstände aufeinander zubewegen ohne Kollision Spiele- und Multimedia-Programmierung 4
A JMF ohne Installation Spiele- und Multimedia-Programmierung 4
Developer_X Sound Lautstärke ohne spezifische API regulieren Spiele- und Multimedia-Programmierung 3
L JMF Player spielt mp3 nur ohne Ton Spiele- und Multimedia-Programmierung 14
T 3D-Tetris Feld neuzeichnen ohne neue Branchgroup Spiele- und Multimedia-Programmierung 18
O Java3D-Applet ohne Java3D-Runtime ausführen Spiele- und Multimedia-Programmierung 2
L klick auf ComboBox ohne ActionListener --> CPU ausgelaste Spiele- und Multimedia-Programmierung 13
H Tic Tac Toe / 3 Gewinnt OHNE Applet Spiele- und Multimedia-Programmierung 9
S 3D Objekte ohne Java3D darstellen? Spiele- und Multimedia-Programmierung 10
B Sudoku Generator ohne Solerver möglich? Spiele- und Multimedia-Programmierung 20
G Farbig zeichnen ohne java.awt.Color? Spiele- und Multimedia-Programmierung 5
F Farbe ändern bei Überlappung Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben