/**
 * Der Visitor, der Bäume durchläuft, um deren Höhe zu bestimmen
 */
public class HoehenVisitor implements BaumVisitor{  

    public Object visitBlatt( Object daten) {
	// bloßes Blatt hat Höhe 1
	return new Integer(1);

    }

    public Object visitKnoten( Baum links, Baum rechts ) {
	// Hier wird der Visitor, um den es hier geht - nämlich this -
	// auf die Teilbäume angewendet
	// FALSCHES *DESIGN* wäre: linkeHoehe = links.hoehe();
	// Dann würden ständig neue Visitors erzeugt.
	// Bei komplizierteren Funktionen würde dann evtl. auch ein falsches
	// Ergebnis berechnet werden.
	int linkeHoehe = ((Integer)links.accept(this)).intValue();
	int rechteHoehe = ((Integer)rechts.accept(this)).intValue();

	// innerer Knoten hat Höhe, die um 1 größer als das Maximum der Höhen
	// der beiden unmittelbaren Teilbäume ist
	return new Integer(1 + Math.max( linkeHoehe, rechteHoehe ));

    }


}


/* Für jede weitere rekursive Funktion würde man eine Methode in Baum.java
   stecken, die wie hoehe() bloß accept für einen passenden neuen Visitor
   aufruft. Der wird durch eine neue Klasse gegeben, die das Interface
   BaumVisitor implementiert. Blatt und Knoten brauchen nicht mehr angepaßt
   zu werden. */
