16.3 Binärer Baum
 
  Ein Binärbaum hat zunächst eine Wurzel aus ihr wächst ein Stamm mit zwei Ästen. Man kann ihn zeichnen, wenn man die Methode zeichnen() in TurtleDemo.java so abändert:

public void zeichnen(){
   eineTurtle.vor(100);
   eineTurtle.rechts(90);
   eineTurtle.vor(100);
   eineTurtle.vor(-200);
}

Ändert man noch Titel und Größe des Bildes so erhält man die unten stehende Darstellung.

Einen richtigen binären Baum erhält man, wenn man an den Ästen den Vorgang mit z.B. halber Stamm, bzw. Astlänge wiederholt, die Enden der Äste also als Wurzeln der nächsten Generation sieht. Wir wollen dies rekursiv realisieren. Dazu müssen wir  allerdings dafür sorgen, dass an den Enden, bevor der rekursive Aufruf erfolgt, die Turtle wieder in die Ausgangsrichtung zeigt. Als Abbruchbedingung für die Iteration wählen wir die Bedingung, dass die gezeichneten Strecken eine Mindestlänge haben.


      

 

Download:

BinaerBaum. java

Wir implementieren eine eigene Klasse BinaerBaum, die die zeichne()-Methode enthält.

public class BinaerBaum{

   public void zeichne(Turtle t, int l){
      if (l>0){
         t.vor(l);
         t.rechts(90); t.vor(l); t.rechts(-90);
         zeichne(t,l/2);
         t.rechts(90); t.vor(-2*l); t.rechts(-90);
         zeichne(t,l/2);
         t.rechts(90); t.vor(l);t.rechts(-90);
         t.vor(-l);
      }
   }
}

 


 
Im QuellCode von TurtleDemo.java, den wir zu BinaerBaumDemo.java umbenennen, wird im wesentlichen die Methode actionPerformed(..) neu implementiert. Während sie bisher lediglich die Methode zeichnen() aufrief, sorgt sie jetzt dafür, dass eine sog. Instanz von Turtle erzeugt wird, diese auf dem Zeichenfeld platziert wird (hier: (200,280)),  und danach die wird die Methode zeichne(..) der Klasse BinaerBaum für die Instanz binaerBaum aufgerufen. Dabei wird die Turtle-Instanz und die Anfangsschrittlänge übergeben. Die Übergabe der Turtle-Instanz ist deshalb nötig, weil die Methode zeichne() in BinaerBaum auf die Methoden der Turtle-Instanz zugreifen soll.


public void actionPerformed(ActionEvent e){
   BinaerBaum binaerBaum = new BinaerBaum();
   binaerBaum.zeichne(eineTurtle, 100);
}

  

 

 

 

Die ganze Klasse BinaerBaumDemo. java Veränderungen gegenüber der Klasse TurtleDemo sind farblich gekennzeichnet:
 
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BinaerBaumDemo extends JFrame implements ActionListener{

   Turtle eineTurtle;
   
   public BinaerBaumDemo(String titel){
      super(titel);
      addWindowListener(new WindowAdapter() {
           public void windowClosing (WindowEvent evt) {System.exit(0);}});
      
      Container cp = getContentPane();
      cp.setLayout(new BorderLayout());



      eineTurtle = new Turtle(200,280);
      eineTurtle.setPreferredSize(new Dimension(400, 300));
      eineTurtle.setBackground(Color.white);
      cp.add(eineTurtle,BorderLayout.CENTER);

      JButton button = new JButton("Zeichne!");
      button.addActionListener(this);
      cp.add(button,BorderLayout.SOUTH);
      
      pack();
      setVisible(true);
      
   }
   
   public void actionPerformed(ActionEvent e){
      BinaerBaum binaerBaum = new BinaerBaum();
      binaerBaum.zeichne(eineTurtle, 100);     
   }
   
   
   public static void main(String[] args){
      new BinaerBaumDemo("Binärbaum");
   }
}
zu 16.4 Sierpinski-Dreieck
zur Startseite www.pohlig.de  (C) MPohlig 2003