\section{Paarungen (Matchings) in Bäumen}
\begin{tasks}
\item
	\label{1a}
	Ein Baum ist ein kreisfreier, zusammenhängender Graph. Ein Baum besitzt ein
	perfektes Matching genau dann, wenn die Anzahl der Knoten gerade ist und
	jedes Blatt keine Geschwisterknoten hat.

	Die Anzahl der Knoten muss gerade sein, da in einem perfekten Match\-ing jeder
	Knoten mit einem anderen gematcht wird.
	
	Jedes Blatt muss Einzelblatt sein, da der Elternknoten nur mit einem Blatt
	gematcht werden kann.

	Also ist ein perfektes Matching im Baum eindeutig, da jedes Blatt mit seinem
	Elternknoten gematcht werden muss. Die Kante ist sicher im Matching enthalten
	und kann aus dem Graphen entfernt werden. So entsteht ein neues Blatt, für das
	die selbe Regel gilt.
	\points{3}
\item
	Der \autoref{alg:treematching} berechnet ein größtes Matching.

	Der Algorithmus ist korrekt, da der Baum $T$ entweder eine gerade Anzahl an
	Knoten hat, und somit ein perfektes Matching berechnet (Siehe \autoref{1a}) oder genau einen Knoten
	zu wenig hat und somit das größte Matching um eins kleiner ist, als das perfekte
	Matching des nächst größeren Baums.

	Die Laufzeit liegt in $\Oh(E)$, da jede Kante maximal einmal zum Matching hinzugefügt
	und dann aus dem Baum entfernt wird.
	\begin{algorithm}
		\centering
		\caption{Größtes Matching in Bäumen}
		\label{alg:treematching}
		\begin{algorithmic}
			\alg{MatchaTee}{$T = \tup{V, E}$} \+ \\
				\com{Wurzeln} \\
				$r \gets V[1]$ \\ 
				\com{Wenn Knoten Blatt ist, dann die Kante zum Elternknoten zurückgeben.} \\
				if $deg(r) = 1$ then \+ \\
					\com{Die Kante aus dem Baum entfernen.} \\
					$E \gets E \setminus \set{\set{r, Adj[r]}}$ \\
					$V \gets V \setminus \set{r}$ \\
					return $\set{\set{r, Adj[r]}}$ \- \\
				\com{Rekursiv für die Kinder aufrufen} \\
				$m \gets \emptyset$ \\
				foreach $v \in Adj[r]$ do \+ \\
				$m \gets m \cup \text{\alg{MatchaTee}{T}}$ \- \\
				return $m$
		\end{algorithmic}
	\end{algorithm}
	\points{5}
\item
	\points{5}
\end{tasks}
