\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,baum}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Frühjahr 2014 (46115) - Thema 2 Aufgabe 3},
  Thematik = {Binärer Suchbaum 17, 7, 21, 3, 10, 13, 1, 5},
  Referenz = 46115-2014-F.T2-A3,
  RelativerPfad = Examen/46115/2014/03/Thema-2/Aufgabe-3.tex,
  ZitatSchluessel = examen:46115:2014:03,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Binärbaum},
  EinzelpruefungsNr = 46115,
  Jahr = 2014,
  Monat = 03,
  ThemaNr = 2,
  AufgabeNr = 3,
}

\begin{enumerate}

%%
% (a)
%%

\item Fügen Sie die Zahlen 17, 7, 21, 3, 10, 13, 1, 5 nacheinander in
der vorgegebenen Reihenfolge in einen binären Suchbaum ein und zeichnen
Sie das Ergebnis!\index{Binärbaum}
\footcite{examen:46115:2014:03}

\begin{bAntwort}
\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.17
  [.7
    [.3
      [.1 ]
      [.5 ]
    ]
    [.10
      \edge[blank]; \node[blank]{};
      [.13 ]
    ]
  ]
  [.21 ]
]
\end{tikzpicture}
\end{center}
\end{bAntwort}

%%
% (b)
%%

\item Implementieren Sie in einer objektorientierten Programmiersprache
eine rekursiv festgelegte Datenstruktur, deren Gestaltung sich an
folgender Definition eines binären Baumes orientiert!

Ein binärer Baum ist entweder ein leerer Baum oder besteht aus einem
Wurzelelement, das einen binären Baum als linken und einen als rechten
Teilbaum besitzt. Bei dieser Teilaufgabe können Sie auf die
Implementierung von Methoden (außer ggf. notwendigen Konstruktoren)
verzichten!

\begin{bAntwort}
\bPseudoUeberschrift{Klasse „Knoten“}

\begin{minted}{java}
class Knoten {
  public int wert;
  public Knoten links;
  public Knoten rechts;
  public Knoten elternKnoten;

  Knoten(int wert) {
    this.wert = wert;
    links = null;
    rechts = null;
    elternKnoten = null;
  }

  public Knoten findeMiniumRechterTeilbaum() {
  }

  public void anhängen (Knoten knoten) {
  }
}
\end{minted}

\bPseudoUeberschrift{Klasse „BinärerSuchbaum“}

\begin{minted}{java}

public class BinärerSuchbaum {
  public Knoten wurzel;

  BinärerSuchbaum(Knoten wurzel) {
    this.wurzel = wurzel;
  }

  BinärerSuchbaum() {
    this.wurzel = null;
  }

  public void einfügen(Knoten knoten) {
  }

  public void einfügen(Knoten knoten, Knoten elternKnoten) {
  }

  public Knoten suchen(int wert) {
  }

  public Knoten suchen(int wert, Knoten knoten) {
  }

}
\end{minted}

\end{bAntwort}
%%
% (c)
%%

\item Beschreiben Sie durch Implementierung in einer gängigen
objektorientierten Programmiersprache, wie bei Verwendung der obigen
Datenstruktur die Methode \bJavaCode{loescheKnoten(w)} gestaltet sein muss,
mit der der Knoten mit dem Eintrag \bJavaCode{w} aus dem Baum entfernt werden
kann, ohne die Suchbaumeigenschaft zu verletzen!

\begin{bAntwort}
\bJavaExamen[firstline=64,lastline=93]{46115}{2014}{03}{suchbaum/BinaererSuchbaum}
\end{bAntwort}
\end{enumerate}

\begin{bAntwort}
\bPseudoUeberschrift{Klasse „BinärerSuchbaum“}

\bJavaExamen{46115}{2014}{03}{suchbaum/BinaererSuchbaum}

\bPseudoUeberschrift{Klasse „Knoten“}

\bJavaExamen{46115}{2014}{03}{suchbaum/Knoten}
\end{bAntwort}
\end{document}
