\documentclass{bschlangaul-aufgabe}
\bLadePakete{baum,java}
\begin{document}
\bAufgabenMetadaten{
  Titel = {5. Datenstrukturen und Algorithmen: Binäre Suchbäume und AVL-Bäume},
  Thematik = {Binäre Suchbäume, AVL-Bäume, Implementierung},
  Referenz = 46115-2010-F.T1-A5,
  RelativerPfad = Examen/46115/2010/03/Thema-1/Aufgabe-5.tex,
  ZitatSchluessel = examen:46115:2010:03,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Binärbaum, AVL-Baum},
  EinzelpruefungsNr = 46115,
  Jahr = 2010,
  Monat = 03,
  ThemaNr = 1,
  AufgabeNr = 5,
}

\section{5. Datenstrukturen und Algorithmen: Binäre Suchbäume und AVL-Bäume
\index{Binärbaum}
\index{AVL-Baum}
\footcite{examen:46115:2010:03}}

\begin{enumerate}
\item Geben Sie jeweils eine Definition für binäre Suchbäume und
AVL-Bäume an.

\begin{bAntwort}

\begin{description}
\item[Binärer Suchbaum] Für jeden Knoten gilt: Ein Knoten enthält einen
Schlüsselwert. Ein Knoten hat zwei Kindknoten: einen linken und einen
rechten Kindknoten. Alle Schlüsselwerte des linken Teilbaums sind
kleiner, alle Schlüsselwerte des rechten Teilbaums sind größer als der
Wert des Knotens.

\item[AVL-Baum] Alle Eigenschaften des oben definierten binären
Suchbaums gelten auch im AVL-Baum. Zusätzlich gilt: Die Differenz der
Höhen des rechten und linken Teilbaums darf sich nie mehr als um eins
unterscheiden.
\end{description}

\end{bAntwort}

\item Zeichnen Sie einen AVL-Baum, der die folgenden Schlüssel enthält:
11, 1, 5, 37, 17, 29, 31, 3.

\begin{bAntwort}
\begin{bBaum}{Nach dem Einfügen von „11“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=0]{11}; ]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach dem Einfügen von „1“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=-1]{11};
  [.\node[label=0]{1}; ]
  \edge[blank]; \node[blank]{};
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach dem Einfügen von „5“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=-2]{11};
  [.\node[label=+1]{1};
    \edge[blank]; \node[blank]{};
    [.\node[label=0]{5}; ]
  ]
  \edge[blank]; \node[blank]{};
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach der Linksrotation}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=-2]{11};
  [.\node[label=-1]{5};
    [.\node[label=0]{1}; ]
    \edge[blank]; \node[blank]{};
  ]
  \edge[blank]; \node[blank]{};
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach der Rechtsrotation}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=0]{5};
  [.\node[label=0]{1}; ]
  [.\node[label=0]{11}; ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach dem Einfügen von „37“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+1]{5};
  [.\node[label=0]{1}; ]
  [.\node[label=+1]{11};
    \edge[blank]; \node[blank]{};
    [.\node[label=0]{37}; ]
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach dem Einfügen von „17“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+2]{5};
  [.\node[label=0]{1}; ]
  [.\node[label=+2]{11};
    \edge[blank]; \node[blank]{};
    [.\node[label=-1]{37};
      [.\node[label=0]{17}; ]
      \edge[blank]; \node[blank]{};
    ]
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach der Rechtsrotation}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+2]{5};
  [.\node[label=0]{1}; ]
  [.\node[label=+2]{11};
    \edge[blank]; \node[blank]{};
    [.\node[label=+1]{17};
      \edge[blank]; \node[blank]{};
      [.\node[label=0]{37}; ]
    ]
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach der Linksrotation}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+1]{5};
  [.\node[label=0]{1}; ]
  [.\node[label=0]{17};
    [.\node[label=0]{11}; ]
    [.\node[label=0]{37}; ]
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach dem Einfügen von „29“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+2]{5};
  [.\node[label=0]{1}; ]
  [.\node[label=+1]{17};
    [.\node[label=0]{11}; ]
    [.\node[label=-1]{37};
      [.\node[label=0]{29}; ]
      \edge[blank]; \node[blank]{};
    ]
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach der Linksrotation}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=0]{17};
  [.\node[label=0]{5};
    [.\node[label=0]{1}; ]
    [.\node[label=0]{11}; ]
  ]
  [.\node[label=-1]{37};
    [.\node[label=0]{29}; ]
    \edge[blank]; \node[blank]{};
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach dem Einfügen von „31“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+1]{17};
  [.\node[label=0]{5};
    [.\node[label=0]{1}; ]
    [.\node[label=0]{11}; ]
  ]
  [.\node[label=-2]{37};
    [.\node[label=+1]{29};
      \edge[blank]; \node[blank]{};
      [.\node[label=0]{31}; ]
    ]
    \edge[blank]; \node[blank]{};
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach der Linksrotation}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+1]{17};
  [.\node[label=0]{5};
    [.\node[label=0]{1}; ]
    [.\node[label=0]{11}; ]
  ]
  [.\node[label=-2]{37};
    [.\node[label=-1]{31};
      [.\node[label=0]{29}; ]
      \edge[blank]; \node[blank]{};
    ]
    \edge[blank]; \node[blank]{};
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach der Rechtsrotation}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=0]{17};
  [.\node[label=0]{5};
    [.\node[label=0]{1}; ]
    [.\node[label=0]{11}; ]
  ]
  [.\node[label=0]{31};
    [.\node[label=0]{29}; ]
    [.\node[label=0]{37}; ]
  ]
]
\end{tikzpicture}
\end{bBaum}

\begin{bBaum}{Nach dem Einfügen von „3“}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=-1]{17};
  [.\node[label=-1]{5};
    [.\node[label=+1]{1};
      \edge[blank]; \node[blank]{};
      [.\node[label=0]{3}; ]
    ]
    [.\node[label=0]{11}; ]
  ]
  [.\node[label=0]{31};
    [.\node[label=0]{29}; ]
    [.\node[label=0]{37}; ]
  ]
]
\end{tikzpicture}
\end{bBaum}
\end{bAntwort}

\item Welche Zeitkomplexität haben die Operationen \emph{Einfügen},
\emph{Löschen} und \emph{Suchen} auf AVL-Bäumen? Begründen Sie Ihre
Antwort.

\begin{bAntwort}
Für alle Operationen wird jeweils nur ein Pfad von der Wurzel bis zum
gewünschten Knoten beschritten. Für alle Operation ist deshalb die
maximale Höhe des Baums entscheidend. Da AVL-Bäume höhenbalanciert sind.

\end{bAntwort}

\item Implementieren Sie die Datenstruktur AVL-Baum mit Schlüsseln vom
Typ int (für Java oder entsprechende Datentypen für die anderen
Programmiersprachen) in entweder Java, C++, Smalltalk oder Eiffel. Ihre
Implementierung muss als einzige Operation die Methode suche
bereitstellen, die einen Schlüssel als Parameter bekommt und

\begin{itemize}
\item true zurückliefert, wenn der gesuchte Schlüssel im Baum enthalten
ist,

\item ansonsten false.
\end{itemize}

Ihre Implementierung muss keine Konstruktoren oder andere Methoden zur
Initialisierung bereitstellen. Desweiteren soll die Implementierung nur
Schlüsselknoten berücksichtigen.

Kommentieren Sie Ihre Implementierung ausführlich. Geben Sie an, welche
Programmiersprache Sie gewählt haben.
\end{enumerate}

\bJavaExamen{46115}{2010}{03}{AVLBaum}

\end{document}
