\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,baum,mathe}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 2},
  Thematik = {Bäume},
  Referenz = 66115-2020-H.T1-TA2-A2,
  RelativerPfad = Examen/66115/2020/09/Thema-1/Teilaufgabe-2/Aufgabe-2.tex,
  ZitatSchluessel = examen:66115:2020:09,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Binärbaum, AVL-Baum},
  EinzelpruefungsNr = 66115,
  Jahr = 2020,
  Monat = 09,
  ThemaNr = 1,
  TeilaufgabeNr = 2,
  AufgabeNr = 2,
}

\newmintinline[p]{pascal}{}

Wir betrachten ein Feld A von ganzen Zahlen mit \p{n} Elementen, die über
die Indizes \p{A[O]} bis \p{A[n-1]} angesprochen werden können. In dieses Feld
ist ein binärer Baum nach den folgenden Regeln eingebettet: Für das
Feldelement mit Index $i$ befindet sich
\index{Binärbaum}
\footcite{examen:66115:2020:09}

\begin{itemize}
\item der Elternknoten im Feldelement mit Index $\lfloor\frac{i-1}{2}\rfloor$,

\item der linke Kindknoten im Feldelement mit Index $2 \cdot i + 1$, und

\item der rechte Kindknoten im Feldelement mit Index $2 \cdot i + 2$.
\end{itemize}
\begin{enumerate}

%%
% a)
%%

\item Zeichnen Sie den durch das folgende Feld repräsentierten binären
Baum.

\begin{center}
\begin{tabular}{|r|c|c|c|c|c|c|c|c|c|c|c|}
\hline
i        & 0 & 1 & 2 & 3  & 4  & 5  & 6 & 7  & 8  & 9  & 10\\\hline
\p{A[i]} & 2 & 4 & 6 & 14 & 12 & 10 & 8 & 22 & 20 & 18 & 16\\\hline
\end{tabular}
\end{center}

\begin{bAntwort}
\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.2
  [.4
    [.14
      [.22 ]
      [.20 ]
    ]
    [.12
      [.18 ]
      [.16 ]
    ]
  ]
  [.6
    [.10 ]
    [.8 ]
  ]
]
\end{tikzpicture}
\end{center}
\end{bAntwort}

%%
% b)
%%

\item Der folgende rekursive Algorithmus sei gegeben:

\bPseudoUeberschrift{Pseudo-Code / Pascal}

\begin{minted}{pascal}
procedure magic(i, n : integer) : boolean
begin
  if (i > (n - 2) / 2) then
    return true;
  endif
  if (A[i] <= A[2 * i + 1] and A[i] <= A[2 * i + 2] and
      magic(2 * i + 1, n) and magic(2 * i + 2, n)) then
    return true;
  endif
  return false;
end
\end{minted}

\bPseudoUeberschrift{Java-Implementation}

\bJavaExamen[firstline=6,lastline=15]{66115}{2020}{09}{Baum}

Gegeben sei folgendes Feld:

\begin{center}
\begin{tabular}{|r|c|c|c|c|c|}
\hline
i        & 0 & 1 & 2 & 3  \\\hline
\p{A[i]} & 2 & 4 & 6 & 14 \\\hline
\end{tabular}
\end{center}

Führen Sie \p{magic(0,3)} auf dem Feld aus. Welches Resultat liefert der
Algorithmus zurück?

\begin{bAntwort}
true
\end{bAntwort}

%%
% c)
%%

\item Wie nennt man die Eigenschaft, die der Algorithmus \p{magic} auf
dem Feld A prüft? Wie lässt sich diese Eigenschaft formal beschreiben?

\begin{bAntwort}
Die sogenannte „Haldeneigenschaft“ bzw. „Heap-Eigenschaft“ einer
Min-Halde. Der Schlüssel eines jeden Knotens ist kleiner (oder gleich)
als die Schlüssel seiner Kinder.\footcite[Seite 407]{saake}

Ein Baum erfüllt die Heap-Eigenschaft bezüglich einer Vergleichsrelation
„$>$“ auf den Schlüsselwerten genau dann, wenn für jeden Knoten $u$ des
Baums gilt, dass $u_\text{wert} > v_\text{wert}$ für alle Knoten $v$ aus
den Unterbäumen von $u$.\footcite[Seite 259]{weicker}
\end{bAntwort}

%%
% d)
%%

\item Welche Ausgaben sind durch den Algorithmus \p{magic} möglich, wenn
das Eingabefeld aufsteigend sortiert ist? Begründen Sie Ihre Antwort.

\begin{bAntwort}
\bJavaCode{true}. Eine sortierte aufsteigende Zahlenfolge entspricht den
Haldeneigenschaften einer Min-Heap.
\end{bAntwort}

%%
% e)
%%

\item Geben Sie zwei dreielementige Zahlenfolgen (bzw. Felder) an, eine
für die \p{magic(0,2)} den Wert \p{true} liefert und eine, für die
\p{magic(0,2)} den Wert \p{false} liefert.

\begin{bAntwort}
\bJavaExamen[firstline=35,lastline=39]{66115}{2020}{09}{Baum}
\end{bAntwort}

%%
% f)
%%

\item Betrachten Sie folgende Variante \p{almostmagic} der oben bereits
erwähnten Prozedur \p{magic}, bei der die Anweisungen in Zeilen 3 bis 5
entfernt wurden:

\bPseudoUeberschrift{Pseudo-Code / Pascal}

\begin{minted}{pascal}
procedure almostmagic(i, n : integer) : boolean
begin
  // leer
  // leer
  // leer
  if (A[i] <= A[2 * i + 1] and A[i] <= A[2 * i + 2] and
      magic(2 * i + 1, n) and magic(2 * i + 2, n)) then
    return true;
  endif
  return false;
end
\end{minted}

\bPseudoUeberschrift{Java-Implementation}

\bJavaExamen[firstline=17,lastline=23]{66115}{2020}{09}{Baum}

Beschreiben Sie die Umstände, die auftreten können, wenn \p{almostmagic}
auf einem Feld der Größe \p{n} aufgerufen wird. Welchen Zweck erfüllt
die entfernte bedingte Anweisung?

\begin{bAntwort}
Wird die Prozedur zum Beispiel mit \p{almostmagic(0, n + 1)} aufgerufen,
kommst es zu einem sogenannten „Array-Index-Ouf-of-Bounds“ Fehler, d. h.
die Prozedur will auf Index des Feldes zugreifen, der im Feld gar nicht
existiert. Die drei zusätzlichen Zeilen in der Methode \p{magic} bieten
dafür einen Schutz, indem sie vor den Index-Zugriffen auf das Feld
\p{true} zurückgeben.

\bJavaExamen[firstline=41,lastline=42]{66115}{2020}{09}{Baum}
\end{bAntwort}

%%
% g)
%%

\item Fügen Sie jeweils den angegebenen Wert in den jeweils angegebenen
AVL-Baum mit aufsteigender Sortierung ein und zeichnen Sie den
resultierenden Baum vor möglicherweise erforderlichen Rotationen. Führen
Sie danach bei Bedarf die erforderliche(n) Rotation(en) aus und zeichnen
Sie dann den resultierenden Baum. Sollten keine Rotationen erforderlich
sein, so geben Sie dies durch einen Text wie „keine Rotationen nötig”
an.
\index{AVL-Baum}

\begin{enumerate}

%%
% i.)
%%

\item Wert 7 einfügen

\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=0]{8};
  [.\node[label=+1]{4};
    \edge[blank]; \node[blank]{};
    [.\node[label=0]{6}; ]
  ]
  [.\node[label=+1]{10};
    \edge[blank]; \node[blank]{};
    [.\node[label=0]{12}; ]
  ]
]
\end{tikzpicture}
\end{center}

\begin{bAntwort}
\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=0]{8};
  [.\node[label=0]{6};
    [.\node[label=0]{4}; ]
    [.\node[label=0]{7}; ]
  ]
  [.\node[label=+1]{10};
    \edge[blank]; \node[blank]{};
    [.\node[label=0]{12}; ]
  ]
]
\end{tikzpicture}
\end{center}
\end{bAntwort}

%%
% ii.)
%%

\item Wert 11 einfügen

\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=+1]{8};
  [.\node[label=0]{4}; ]
  [.\node[label=0]{12};
    [.\node[label=0]{10}; ]
    [.\node[label=0]{14}; ]
  ]
]
\end{tikzpicture}
\end{center}

\begin{bAntwort}
\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=0]{10};
  [.\node[label=-1]{8};
    [.\node[label=0]{4}; ]
    \edge[blank]; \node[blank]{};
  ]
  [.\node[label=0]{12};
    [.\node[label=0]{11}; ]
    [.\node[label=0]{14}; ]
  ]
]
\end{tikzpicture}
\end{center}
\end{bAntwort}

%%
% iii.)
%%

\item Wert 5 einfügen

\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=-1]{8};
  [.\node[label=+1]{4};
    \edge[blank]; \node[blank]{};
    [.\node[label=0]{6}; ]
  ]
  [.\node[label=0]{10}; ]
]
\end{tikzpicture}
\end{center}

\begin{bAntwort}
\begin{center}
\begin{tikzpicture}[b binaer baum]
\Tree
[.\node[label=-1]{8};
  [.\node[label=0]{5};
    [.\node[label=0]{4}; ]
    [.\node[label=0]{6}; ]
  ]
  [.\node[label=0]{10}; ]
]
\end{tikzpicture}
\end{center}
\end{bAntwort}

\end{enumerate}
\end{enumerate}
\end{document}
