// Übung Informatik II 5.7.2004, Institut für Informatik, Universität München

public abstract class Baum{

    // abstract zwingt alle erbenden Klassen zu einer Implementierung!
    public abstract Object accept ( BaumVisitor v);

    public int hoehe(){
	Integer ergebnis =(Integer) accept( new HoehenVisitor());
	return ergebnis.intValue();
    }

    // hier weitere Methoden ebenso schematisch zu definieren und dann
    // jeweils eine Visitor-Klasse zu definieren

}

class Blatt extends Baum{

    private Object daten;

    public Blatt( Object daten ){

	this.daten = daten;
    }

    public Object accept( BaumVisitor v) {

	return v.visitBlatt(daten);

    }
}

class Knoten extends Baum{
    
    private Baum links;
    private Baum rechts;
    
    public Knoten( Baum links, Baum rechts ){
	
	this.links = links;
	this.rechts = rechts;
    }
    
    public Object accept( BaumVisitor v) {
	
	return v.visitKnoten(links, rechts);
    }
}

// Die Klassen Blatt und Knoten müßten nur erweitert werden, wenn man z.B.
// auch einen imperativen Visitor haben wollte. Weitere Funktionen auf Basis
// des normalen Visitors - hier eben BaumVisitor - sind *hier* nicht nötig.
