package Model.Baum;


/**
 * Beschreibt einen Knoten des Baums.
 * 
 * @author ISB-Arbeitskreis, Umsetzungshilfen Informatik 12
 * @version 1.0
 */
class KNOTEN extends BAUMELEMENT
{
    /* Referenz auf das Datenelement */
    private Model. DATENELEMENT daten;
    /* Referenz auf den linken Nachfolgerknoten (mit den kleineren Werten) */
    private BAUMELEMENT linksnachfolger;
    /* Referenz auf den rechten Nachfolgerknoten (mit den gr&ouml;&szlig;eren Werten) */
    private BAUMELEMENT rechtsnachfolger;
    
    /**
     * Legt einen neuen Knoten mit gegebenem Datenelement und gegebenen Nachfolgern an.
     * @param d Referenz auf das von diesem Knoten verwaltete Datenelement
     * @param lnf Referenz auf das linke Nachfolgerelement
     * @param rnf Referenz auf das rechte Nachfolgerelement
     */
    KNOTEN (Model. DATENELEMENT d, BAUMELEMENT lnf, BAUMELEMENT rnf)
    {
        daten = d;
        linksnachfolger = lnf;
        rechtsnachfolger = rnf;
    }
    
    /**
     * F&uuml;gt ein neues Datenelement in den Baum ein.
     * @param neu Referenz auf des neue Datenelement
     * @return der (neue) Nachfolger f&uuml;r das Vorg&auml;ngerelement
     */
    BAUMELEMENT Einfuegen (Model. DATENELEMENT neu)
    {
        if (neu. Vergleichen (daten) > 0)
        {
            rechtsnachfolger = rechtsnachfolger. Einfuegen (neu);
        }
        else
        {
            linksnachfolger = linksnachfolger. Einfuegen (neu);
        }
        return this;
    }

    
    /**
     * Sucht ein Datenelement mit dem in der Referenz angegebenen Schl&uuml;ssel.
     * @param schluessel Referenz auf ein Datenelement mit dem zu suchenden Schl&uuml;sselwert
     * @return das gefundene Datenelement oder null
     */
    Model. DATENELEMENT Suchen (Model. DATENELEMENT schluessel)
    {
        int vergleich;
        BAUM. ZaehlerErhoehen ();
        vergleich = schluessel. Vergleichen (daten);
        if (vergleich == 0)
        {
            return daten;
        }
        else if (vergleich < 0)
        {
            return linksnachfolger. Suchen (schluessel);
        }
        else
        {
            return rechtsnachfolger. Suchen (schluessel);
        }
    }
    
}
