/* Datentypmodul BinBaum --- Binaerer Baum
   Baeume dieses Datentyps speichern vorzeichenbehaftete ganze Zahlen.  Die
   verkapselte Entwurfsentscheidung ist die interne Speicherung der Knoten.
   Die Namen befolgen die Baum-Metapher so weit wie moeglich.
   Die Kommentare sind aus Platzgruenden sparsamer.
*/
#pragma once
#include "stdafx.h" 

struct BinBaumKnotenT;          // Der opake Eintragstyp.

/* Erzeugungs- und Loeschoperationen */
BinBaumKnotenT & neuerKnoten();
void zerstoereKnoten(BinBaumKnotenT & opfer);

/* Zugriff auf den gespeicherten Wert */
int  leseWert (BinBaumKnotenT const & knoten);
void setzeWert(BinBaumKnotenT       & knoten, int neuerWert);

/* Navigation zu den Nachbarn.  Liefern NULL und geben eine Fehlermeldung
   aus, falls linkerAstExistiert (etc.) false liefern. */
BinBaumKnotenT * linkerAst (BinBaumKnotenT const & stamm);
BinBaumKnotenT * rechterAst(BinBaumKnotenT const & stamm);
BinBaumKnotenT * stamm     (BinBaumKnotenT const & ast  );

/* Abfragen zur Struktur */
bool linkerAstExistiert (BinBaumKnotenT const & knoten);
bool rechterAstExistiert(BinBaumKnotenT const & knoten);
bool stammExistiert     (BinBaumKnotenT const & knoten);

/* Struktur des Baumes aendern: Aeste hinzufuegen oder absaegen.  Der Stamm
   bleibt.  */
/* Neue Aeste anbringen.  Eventuell vorhandene Aeste werden dabei abgesaegt, 
   aber nicht zerstoert. */
void setzeLinkenAst (BinBaumKnotenT & stammKnoten,
                     BinBaumKnotenT & neuerLinkerAstKnoten);
void setzeRechtenAst(BinBaumKnotenT & stammKnoten,
                     BinBaumKnotenT & neuerRechterAstKnoten);

/* Die Aeste werden abgesaegt, aber nicht zerstoert. */
void loescheLinkenAst (BinBaumKnotenT & stammKnoten);
void loescheRechtenAst(BinBaumKnotenT & stammKnoten);

