Lösungsvorschläge

zu den Aufgaben im Kapitel 6


Aufgabe 6.1: Beweisen Sie, dass ein Baum der Tiefe n (höchstens) 2n-1 Knoten besitzen kann. Oder anders herum: Ein Binärbaum mit n Knoten hat mindestens die Tiefe 1 + ëlog2 nû.

Lösung: Der Beweis erfolg nach dem Prinzip der mathematischen Induktion:

1. Die Aussage für n = 1 ist trivial: Ein Baum der Tiefe 1 hat genau 21-1 = 1 Knoten.

2. Angenommen, die Aussage stimmt für n. Wenn nun der Baum vertieft (nach unten verlängert) wird, können an jedem Knoten der untersten Stufe höchstens 2 weitere Knoten angehängt werden. Die Anzahl der Knoten der untersten Stufe ist (die Hälfte aller Knoten) höchstens 2n-1. Die Anzahl der neuen Knoten ist deswegen höchstens 2n. Wenn (nach der Annahme) die Anzahl der alten Knoten höchstens 2n-1 ist, dann ist die Anzahl aller Knoten höchstens 2n+2n-1 = 2n+1-1.


Aufgabe 6.2: Bilden Sie alle sortierten Binärbäume mit drei Knoten, die die Schlüssel 1, 2 und 3 haben.

Lösung:

           


Aufgabe 6.3: Wie kann man die Anzahl der sortierten Binärbäume mit n Knoten (die die Schlüssel 1 bis n haben) berechnen?

Lösung: Sei long asb(long) die Funktion, die die Aufgabe löst. Offenbar muss gelten:

2.1. Induktionsanfang:

asb(0) == 1 (es gibt genau einen sortierten Baum mit 0 Knoten)

asb(1) == 1 (es gibt genau einen sortierten Baum mit einem Knoten)

2.2. Induktionsschritt: asb(n) == ?

Von den n Zahlen muss jeweils eine, nennen wir sie i, an der Wurzel stehen. Der linke Unterbaum der Wurzel enthält dann i-1 Knoten und der rechte Unterbaum der Wurzel enthält die übrigen n-1-i Knoten. Sortierte Bäume mit n Knoten und i an der Wurzel gibt es dann asb(i-1)*asb(n-1-i) viele („jeden linken Unterbaum kann man mit jedem rechten Unterbaum kombinieren“).

Wir müssen i von 1 bis n laufen lassen und all diese Zahlen addieren. Hier ist eine Java-Version der Funktion asb:

static long asb(long anzKnoten) { // Anzahl der sortierten Binärbäume
  if (anzKnoten <  0) return 0;
  if (anzKnoten <= 1) return 1;
  long erg = 0;
  for (long anzLinks = 0; anzLinks <= anzKnoten - 1; anzLinks++) {
    long anzRechts = anzKnoten - 1 - anzLinks;
    erg += (asb(anzLinks) * asb(anzRechts)); }
    return erg; }

Diese Funktion liefert folgende Ergebnisse (zum „Überprüfen von Hand“):

n asb(n)
0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862

Aufgabe 6.4: Geben Sie einen Baum an, der zwar sortiert, aber nicht streng sortiert ist.

Lösung:


Die weiteren Lösungen fehlen noch