import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
public class BaumFrame extends JFrame implements ActionListener
{
static final int breite = 128;
JTextField einF, delF, suchF;
JButton einB, randB, del1B, del1randB, suchB;
Element root;
int tiefe, anzahl, mtief;
Font font = new Font("Times", Font.PLAIN, 9);
Font banner = new Font("Times", Font.BOLD, 36);
Graphics offG;
BufferedImage offImage;
String aktion = "";
JPanel nord, sued;
public BaumFrame() {
setLocation(200,200);
einF = new JTextField(3);
delF = new JTextField(3);
suchF = new JTextField(4);
einB = new JButton("Einfügen");
randB = new JButton("10x Zufall einfügen");
del1B = new JButton("Löschen");
del1randB = new JButton("Zufalllöschen");
suchB = new JButton("Suchen");
einB.addActionListener(this);
randB.addActionListener(this);
del1B.addActionListener(this);
del1randB.addActionListener(this);
suchB.addActionListener(this);
nord = new JPanel();
sued = new JPanel();
offImage = new BufferedImage(800,800,BufferedImage.TYPE_INT_ARGB);
offG = offImage.createGraphics();
offG.setColor(new Color(230, 230, 255));
offG.fillRect(0,60,800,800);
offG.setColor(Color.black);
ImagePanel imp = new ImagePanel(offImage);
nord.add(einF);
nord.add(einB);
nord.add(randB);
sued.add(del1B);
sued.add(delF);
sued.add(del1randB);
nord.add(suchF);
nord.add(suchB);
setLayout(new BorderLayout());
add(nord, BorderLayout.NORTH);
add(imp,BorderLayout.CENTER);
add(sued,BorderLayout.SOUTH);
root = null;
setSize(800,800);
setVisible(true);
}
public void paint(Graphics g)
{
tiefe = 0; anzahl = 0; mtief = 0;
parse(root, 1);
if (offG != null)
{
offG.drawString("Anzahl: " + anzahl, 310, 20);
offG.drawString("Tiefe: " + tiefe, 310, 40);
if (anzahl > 0)
offG.drawString("Mittl.Tiefe: " + Double.toString(1.0*mtief/anzahl), 420, 30);
offG.setColor(Color.red);
offG.drawString("Vorher", 110, 20);
offG.drawString("Nachher: " + aktion, 420, 20);
offG.setColor(Color.black);
g.drawImage(offImage, 0, 60, null);
}
}
public void paintTree(Graphics g, Element zeiger, int tiefe, int start, int px, int py, boolean linkerZeiger)
{
int x = start, y = 30 * tiefe;
int diff = breite;
for (int i = 1; i <= tiefe; i++) diff /= 2;
if (zeiger != null)
{
if (linkerZeiger)
{
x = (px > x ? x : px);
} else {
x = (px < x ? x : px);
}
g.drawLine(x, y, px, py);
g.drawRect(x-7, y, 14, 20);
g.drawRect(x-7, y+12, 7, 8);
g.drawRect(x, y+12, 7, 8);
g.setFont(font);
g.drawString((zeiger.value<10?"0":"") + zeiger.value, x-4, y+10);
g.fillOval( x - 5, y + 15, 4, 4);
g.fillOval( x + 3, y + 15, 4, 4);
if (zeiger.left != null)
{
paintTree(g, zeiger.left, tiefe + 1, start - diff, x - 3, y + 17, true);
}
if (zeiger.right != null)
{
paintTree(g, zeiger.right, tiefe + 1, start + diff, x + 5, y + 17, false);
}
}
}
public Element delete1(int wert, Element zeiger)
{
if (zeiger.value == wert && anzahl > 0)
{
if (zeiger.left == null) return zeiger.right;
if (zeiger.right == null) return zeiger.left;
Element templeft = zeiger.left;
Element tempright = zeiger.right;
while (tempright.left != null) tempright = tempright.left;
tempright.left = templeft;
return zeiger.right;
}
else
{
if (wert < zeiger.value) zeiger.left = delete1(wert, zeiger.left);
if (wert > zeiger.value) zeiger.right = delete1(wert, zeiger.right);
}
return zeiger;
}
public Element sortIn(int wert, Element zeiger)
{
if (zeiger == null)
{
zeiger = new Element(wert);
}
else
{
if (wert < zeiger.value)
{
zeiger.left = sortIn(wert, zeiger.left);
}
if (wert > zeiger.value)
{
zeiger.right = sortIn(wert, zeiger.right);
}
}
return zeiger;
}
@Override
public void actionPerformed(ActionEvent e)
{
try
{
if (e.getSource() == einB || e.getSource() == randB || e.getSource() == del1B
|| e.getSource() == del1randB)
{
offG.setColor(new Color(230, 230, 255));
offG.fillRect(0,0,1000,1000);
offG.setColor(Color.black);
paintTree(offG, root, 1, breite + 10, breite + 10, 0, true);
if (e.getSource() == einB)
{
if (!einF.getText().equals(""))
{
int zahl = Integer.parseInt(einF.getText());
root = sortIn(zahl, root);
einF.setText("");
aktion = new String(zahl + " einsortiert");
}
}
if (e.getSource() == randB)
{
for (int i = 0; i < 10; i++) root = sortIn(zufall(1, 99), root);
aktion = new String("");
}
if (e.getSource() == del1B)
{
if (!delF.getText().equals("") && such(Integer.parseInt(delF.getText()), root))
{
int zahl = Integer.parseInt(delF.getText());
root = delete1(zahl, root);
delF.setText("");
aktion = new String(zahl + " gelöscht");
}
}
if ((e.getSource() == del1randB) && anzahl > 0)
{
int zz = zufall(1, 99);
while (!such(zz, root)) zz = zufall(1, 99);
{
root = delete1(zz, root);
aktion = new String(zz + " gelöscht");
}
}
paintTree(offG, root, 1, breite + 270, breite + 270, 0, true);
repaint();
}
if (e.getSource() == suchB)
{
if (!suchF.getText().equals(""))
{
int s = Integer.parseInt(suchF.getText());
suchF.setText(s + (such(s, root) ? " :-)" : " :-("));
}
}
}
catch (java.lang.NumberFormatException nfe)
{
offG.setColor(Color.red);
offG.setFont(banner);
offG.drawString("Bitte natürliche Zahlen eingeben!", 40, 120);
offG.setFont(font);
offG.setColor(Color.black);
repaint();
}
}
public boolean such(int x, Element z)
{
if (z == null) return false;
if (z.value == x) return true;
if (x < z.value) return such(x, z.left); else return such(x, z.right);
}
public void parse(Element zeiger, int tief)
{
if (zeiger != null)
{
if (tief > tiefe) tiefe = tief;
parse(zeiger.left, tief + 1);
anzahl++;
mtief += tief;
parse(zeiger.right, tief + 1);
}
}
public void ausgabe(Element zeiger)
{
if (zeiger != null)
{
ausgabe(zeiger.left);
System.out.println(zeiger.value);
ausgabe(zeiger.right);
}
}
public int zufall(int von, int bis)
{
return (int)(von + Math.random() * (bis - von));
}
}