\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,mathe}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 10},
  Thematik = {Niedrigster gemeinsame Vorfahre},
  Referenz = 66115-2020-F.T2-A10,
  RelativerPfad = Examen/66115/2020/03/Thema-2/Aufgabe-10.tex,
  ZitatSchluessel = examen:66115:2020:03,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Binärbaum},
  EinzelpruefungsNr = 66115,
  Jahr = 2020,
  Monat = 03,
  ThemaNr = 2,
  AufgabeNr = 10,
}

Sei $B$ ein binärer Suchbaum. In jedem Knoten $v$ von $B$ wird ein
Schlüssel $v.\text{key} \in \mathbb{N}$ gespeichert sowie Zeiger
$v.\text{left}$, $v.\text{right}$ und $v.\text{parent}$ auf sein linkes
Kind, auf sein rechtes Kind und auf seinen Elternknoten. Die Zeiger sind
\emph{nil}, wenn der entsprechende Nachbar nicht existiert. Für zwei
Knoten $u$ und $v$ ist wie üblich der \emph{Abstand} die Anzahl der
Kanten auf dem kürzesten Pfad von $u$ nach $v$.
\index{Binärbaum}
\footcite{examen:66115:2020:03}

Für einen Knoten $w$ von $B$ sei $B(w)$ der Teilbaum von $B$ mit Wurzel
$w$. Für zwei Knoten $u$ und $v$ von $B$ ist $w$ ein \emph{gemeinsamer}
Vorfahre, wenn $u$ und $v$ in $B(w)$ liegen. Wir suchen den niedrigsten
gemeinsamen Vorfahren $ngV(u,v)$ von $u$ und $v$, also einen gemeinsamen
Vorfahren $w$, so dass für jeden Vorfahren $w’$ von $u$ und $v$ gilt,
dass $w$ in $B(w’)$ liegt. Wir betrachten verschiedene Szenarien, in
denen Sie jeweils den niedrigsten gemeinsamen Vorfahren von $u$ und $v$
berechnen sollen.

\begin{bExkurs}[Lowest Common Ancestor]
Als Lowest Common Ancestor (LCA) oder „letzter gemeinsamer Vorfahre“
wird in der Informatik und Graphentheorie ein Ermittlungskonzept
bezeichnet, das einen gegebenen gewurzelten Baum von Datenstrukturen
effizient vorverarbeitet, sodass anschließend Anfragen nach dem letzten
gemeinsamen Vorfahren für beliebige Knotenpaare in konstanter Zeit
beantwortet werden können.
\bFussnoteUrl{https://de.wikipedia.org/wiki/Lowest_Common_Ancestor}
\end{bExkurs}

\begin{enumerate}

%%
% (a)
%%

\item Wir bekommen $u$ und $v$ als Zeiger auf die entsprechenden Knoten
in $B$ geliefert. Beschreiben Sie in Worten und in Pseudocode einen
Algorithmus, der den niedrigsten gemeinsamen Vorfahren von $u$ und $v$
berechnet. Analysieren Sie die Laufzeit Ihres Algorithmus.

\bJavaExamen{66115}{2020}{03}{NGV}

%%
% (b)
%%

\item Wir bekommen $u$ und $v$ wieder als Zeiger auf die entsprechenden
Knoten in $B$ geliefert. Seien $d_u$, und $d_v$, die Abstände von $u$
bzw. $v$ zum niedrigsten gemeinsamen Vorfahren von $u$ und $v$. Die
Laufzeit Ihres Algorithmus soll $O(\text{max}\{d_u, d_v\})$ sein. Dabei
kann Ihr Algorithmus in jedem Knoten $v$ eine Information
$v.\text{info}$ speichern. Skizzieren Sie Ihren Algorithmus in Worten.

%%
% (c)
%%

\item Wir bekommen die Schlüssel $u.\text{key}$ und $v.\text{key}$. Die
Laufzeit Ihres Algorithmus soll proportional zum Abstand der Wurzel von
$B$ zum niedrigsten gemeinsamen Vorfahren von $u$ und $v$ sein.
Skizzieren Sie Ihren Algorithmus in Worten.
\end{enumerate}
\end{document}
