SS12 Algorithmen und Datenstrukturen 3. Kapitel Binäre Bäume Christopher Mattern Mai 2012 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3.1 Mathematische Struktur Binärbaum FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 3.1 Mathematische Struktur Binärbaum Der Datentyp (und die Datenstruktur) Binärbaum tritt überall in der Informatik auf: • als binärer Suchbaum FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 3.1 Mathematische Struktur Binärbaum Der Datentyp (und die Datenstruktur) Binärbaum tritt überall in der Informatik auf: • als binärer Suchbaum • als Repräsentation von binären Ausdrücken (logisch, arithmetisch) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 3.1 Mathematische Struktur Binärbaum Der Datentyp (und die Datenstruktur) Binärbaum tritt überall in der Informatik auf: • als binärer Suchbaum • als Repräsentation von binären Ausdrücken (logisch, arithmetisch) • als Entscheidungsbaum FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 3.1 Mathematische Struktur Binärbaum Der Datentyp (und die Datenstruktur) Binärbaum tritt überall in der Informatik auf: • als binärer Suchbaum • als Repräsentation von binären Ausdrücken (logisch, arithmetisch) • als Entscheidungsbaum • als Codierungs-/Decodierungsbaum FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 3.1 Mathematische Struktur Binärbaum Der Datentyp (und die Datenstruktur) Binärbaum tritt überall in der Informatik auf: • als binärer Suchbaum • als Repräsentation von binären Ausdrücken (logisch, arithmetisch) • als Entscheidungsbaum • als Codierungs-/Decodierungsbaum • als binärer Heap (später) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 3.1 Mathematische Struktur Binärbaum Der Datentyp (und die Datenstruktur) Binärbaum tritt überall in der Informatik auf: • als binärer Suchbaum • als Repräsentation von binären Ausdrücken (logisch, arithmetisch) • als Entscheidungsbaum • als Codierungs-/Decodierungsbaum • als binärer Heap (später) • ... FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 Beispiel 1: Arithmetischer Ausdruck mit zweistelligen Operatoren: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 2 Beispiel 1: Arithmetischer Ausdruck mit zweistelligen Operatoren: ((((x2 · x4) + ((x3 − x7) − (x6/x1))) + (x5 · (x9 · x3))) / ((x5 − x6) − x1)) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 2 Beispiel 1: Arithmetischer Ausdruck mit zweistelligen Operatoren: ((((x2 · x4) + ((x3 − x7) − (x6/x1))) + (x5 · (x9 · x3))) / ((x5 − x6) − x1)) / + − + − x2 x4 FG KTuEA, TU Ilmenau x9 / x7 x5 x5 − x3 x1 − x6 x6 x3 x1 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 2 Auswertung: 1) Ordne den Blättern konkrete Werte zu, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, x5 = 7, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, x5 = 7, x6 = 10, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, x5 = 7, x6 = 10, x7 = 5, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, x5 = 7, x6 = 10, x7 = 5, x9 = −5. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, x5 = 7, x6 = 10, x7 = 5, x9 = −5. 2) Werte aus, von den Blättern startend ( bottom-up“). ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Auswertung: 1) Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, x5 = 7, x6 = 10, x7 = 5, x9 = −5. 2) Werte aus, von den Blättern startend ( bottom-up“). ” / −5 40 + − −30 + 3 −9 −7 − −7 FG KTuEA, TU Ilmenau 7 2 5 − 10 − −2 −3 70 −21 10 / −5 −8 7 5 10 −2 5 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 3 Beispiel 2: Codierungs-/Decodierungsbaum FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 4 Beispiel 2: Codierungs-/Decodierungsbaum Zeichen aus Alphabet Σ erhalten binäre Codes (auch verschiedener Länge). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 4 Beispiel 2: Codierungs-/Decodierungsbaum Zeichen aus Alphabet Σ erhalten binäre Codes (auch verschiedener Länge). (Wenige Bits für häufige Buchstaben, lange für seltene.) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 4 Beispiel 2: Codierungs-/Decodierungsbaum Zeichen aus Alphabet Σ erhalten binäre Codes (auch verschiedener Länge). (Wenige Bits für häufige Buchstaben, lange für seltene.) Mini-Beispiel: A 1100 B 0110 C 000 D 111 E 10 F 0011 G 010 H 0010 I 0111 K 1101 Zur Codierung von Zeichenreihen benutzt man direkt die Tabelle. Beispiel: F E I G E hat Codierung 0011 10 0111 010 10. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 4 Präfixfreier“ Code: Kein Codewort ist Anfangsstück eines ” anderen. Damit: eindeutig decodierbar“; ” Fuge zwischen Codes für Buchstaben muss nicht markiert werden: 001110011101010 statt 0011 10 0111 010 10. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 5 Präfixfreier“ Code: Kein Codewort ist Anfangsstück eines ” anderen. Damit: eindeutig decodierbar“; ” Fuge zwischen Codes für Buchstaben muss nicht markiert werden: 001110011101010 statt 0011 10 0111 010 10. Kompakte Repräsentation des Codes als Binärbaum: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 5 Präfixfreier“ Code: Kein Codewort ist Anfangsstück eines ” anderen. Damit: eindeutig decodierbar“; ” Fuge zwischen Codes für Buchstaben muss nicht markiert werden: 001110011101010 statt 0011 10 0111 010 10. Kompakte Repräsentation des Codes als Binärbaum: 0 0 0 C FG KTuEA, TU Ilmenau 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 D 1 K 5 0 0 0 C FG KTuEA, TU Ilmenau 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 D 1 K 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. Wegen Präfixeigenschaft: im Code keine Zwischenräume nötig. Beispiel: 0000010100011 liefert FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. Wegen Präfixeigenschaft: im Code keine Zwischenräume nötig. Beispiel: 0000010100011 liefert ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. Wegen Präfixeigenschaft: im Code keine Zwischenräume nötig. Beispiel: 0000010100011 liefert C ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. Wegen Präfixeigenschaft: im Code keine Zwischenräume nötig. Beispiel: 0000010100011 liefert CH ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. Wegen Präfixeigenschaft: im Code keine Zwischenräume nötig. Beispiel: 0000010100011 liefert CHE ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das Codewort wieder (links: 0, rechts: 1). Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. Wegen Präfixeigenschaft: im Code keine Zwischenräume nötig. Beispiel: 0000010100011 liefert CHEF“. ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 6 Binärbaum-Terminologie: Überblick Wurzel linkes Kind von v2 v1 Kante/Zeiger v2 Vater von v5 v6 v3 v4 v7 v10 l8 l4 v 8 l0 l1 l7 l2 l5 FG KTuEA, TU Ilmenau rechtes Kind von v5 v9 l3 v9 l9 l10 Blatt, externer/äußerer Knoten l6 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 7 Mathematische Struktur: flach“ ” Definition 3.1.1 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 8 Mathematische Struktur: flach“ ” Definition 3.1.1 Ein Binärbaum T besteht FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 8 Mathematische Struktur: flach“ ” Definition 3.1.1 Ein Binärbaum T besteht aus einer endlichen Menge V von inneren“ Knoten, ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 8 Mathematische Struktur: flach“ ” Definition 3.1.1 Ein Binärbaum T besteht aus einer endlichen Menge V von inneren“ Knoten, einer dazu disjunkten endlichen Menge L ” von äußeren“ Knoten ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 8 Mathematische Struktur: flach“ ” Definition 3.1.1 Ein Binärbaum T besteht aus einer endlichen Menge V von inneren“ Knoten, einer dazu disjunkten endlichen Menge L ” von äußeren“ Knoten sowie zwei Funktionen ” leftchild : V → V ∪ L und rightchild : V → V ∪ L, wobei folgendes gilt: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 8 Mathematische Struktur: flach“ ” Definition 3.1.1 Ein Binärbaum T besteht aus einer endlichen Menge V von inneren“ Knoten, einer dazu disjunkten endlichen Menge L ” von äußeren“ Knoten sowie zwei Funktionen ” leftchild : V → V ∪ L und rightchild : V → V ∪ L, wobei folgendes gilt: (i) In V ∪ L gibt es genau einen Knoten r, der nicht als Wert leftchild(v) oder rightchild(v) vorkommt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 8 Mathematische Struktur: flach“ ” Definition 3.1.1 Ein Binärbaum T besteht aus einer endlichen Menge V von inneren“ Knoten, einer dazu disjunkten endlichen Menge L ” von äußeren“ Knoten sowie zwei Funktionen ” leftchild : V → V ∪ L und rightchild : V → V ∪ L, wobei folgendes gilt: (i) In V ∪ L gibt es genau einen Knoten r, der nicht als Wert leftchild(v) oder rightchild(v) vorkommt. Dieser Knoten r heißt die Wurzel. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 8 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. (iii) Kreisfreiheit“: Für jeden Knoten w ∈ V ∪ L gilt: ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. (iii) Kreisfreiheit“: Für jeden Knoten w ∈ V ∪ L gilt: ” Die Folge v0 = w, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. (iii) Kreisfreiheit“: Für jeden Knoten w ∈ V ∪ L gilt: ” Die Folge v0 = w, v1 = p(w), FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. (iii) Kreisfreiheit“: Für jeden Knoten w ∈ V ∪ L gilt: ” Die Folge v0 = w, v1 = p(w), v2 = p(v1), FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. (iii) Kreisfreiheit“: Für jeden Knoten w ∈ V ∪ L gilt: ” Die Folge v0 = w, v1 = p(w), v2 = p(v1), v3 = p(v2), FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. (iii) Kreisfreiheit“: Für jeden Knoten w ∈ V ∪ L gilt: ” Die Folge v0 = w, v1 = p(w), v2 = p(v1), v3 = p(v2), . . . FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” (ii) Die Wertebereiche von leftchild und rightchild bilden eine Partition von (V ∪ L) − {r}, d. h.: für jeden Knoten w ∈ (V ∪ L) − {r} gibt es genau einen Knoten u ∈ V mit w = leftchild (u) oder w = rightchild (u). (Es gilt dabei aber nicht (w = leftchild (u) und w = rightchild (u)).) Dieser Knoten wird mit p(w) bezeichnet und heißt der Vorgängerknoten oder Vaterknoten von w. (iii) Kreisfreiheit“: Für jeden Knoten w ∈ V ∪ L gilt: ” Die Folge v0 = w, v1 = p(w), v2 = p(v1), v3 = p(v2), . . . bricht nach endlich vielen Schritten mit einem vd = r ab. (Dadurch ist ein eindeutiger Weg von w zur Wurzel festgelegt.) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 9 Mathematische Struktur: flach“ (Forts.) ” An Knoten und Kanten lassen gen/Beschriftungen anbringen. sich Markierun- Diese werden ebenfalls als Funktionen dargestellt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 10 Mathematische Struktur: flach“ (Forts.) ” An Knoten und Kanten lassen gen/Beschriftungen anbringen. sich Markierun- Diese werden ebenfalls als Funktionen dargestellt. Knotenmarkierungen: Funktionen mV : V → D und mL : L → Z. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 10 Mathematische Struktur: flach“ (Forts.) ” An Knoten und Kanten lassen gen/Beschriftungen anbringen. sich Markierun- Diese werden ebenfalls als Funktionen dargestellt. Knotenmarkierungen: Funktionen mV : V → D und mL : L → Z. Kantenmarkierungen: Funktionen ml : V → X (für die leftchild-Kanten) und mr : V → X (für die rightchild-Kanten). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 10 Mathematische Struktur: rekursiv FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 11 Mathematische Struktur: rekursiv D: Menge von Knotenmarkierungen FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 11 Mathematische Struktur: rekursiv D: Menge von Knotenmarkierungen Z: Menge von Blattmarkierungen FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 11 Mathematische Struktur: rekursiv D: Menge von Knotenmarkierungen Z: Menge von Blattmarkierungen Induktive Definition: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 11 Mathematische Struktur: rekursiv D: Menge von Knotenmarkierungen Z: Menge von Blattmarkierungen Induktive Definition: (i) Wenn z ∈ Z, so ist (z) ein (D, Z)-Binärbaum. [Blatt mit Markierung z.] FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 11 Mathematische Struktur: rekursiv D: Menge von Knotenmarkierungen Z: Menge von Blattmarkierungen Induktive Definition: (i) Wenn z ∈ Z, so ist (z) ein (D, Z)-Binärbaum. [Blatt mit Markierung z.] (ii) Wenn T1, T2 (D, Z)-Binärbäume sind und x ∈ D ist FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 11 Mathematische Struktur: rekursiv D: Menge von Knotenmarkierungen Z: Menge von Blattmarkierungen Induktive Definition: (i) Wenn z ∈ Z, so ist (z) ein (D, Z)-Binärbaum. [Blatt mit Markierung z.] (ii) Wenn T1, T2 (D, Z)-Binärbäume sind und x ∈ D ist, dann ist auch (T1, x, T2) ein (D, Z)-Binärbaum. [Wurzel mit Markierung x, linker Unterbaum T1, rechter Unterbaum T2.] (iii) Nichts sonst ist (D, Z)-Binärbaum. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 11 Beispiel: Tupeldarstellung (((37, b, (17, a, 31)), c, 7), b, ((29, d, (1, r, 23)), z, (13, u, 3))) und graphische Darstellung: b c 7 b 37 d u 29 a 17 FG KTuEA, TU Ilmenau z 31 13 r 1 3 23 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 12 Beispiel: Arithmetischer Ausdruck als Baum D = {+, −, ·, /} und Z = {x1, x2, x3, . . .}. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 13 Beispiel: Arithmetischer Ausdruck als Baum D = {+, −, ·, /} und Z = {x1, x2, x3, . . .}. / + − + − x2 x4 x9 / x7 x5 x5 − x3 x1 − x6 x6 x3 x1 ((((x2 · x4) + ((x3 − x7) − (x6/x1))) + (x5 · (x9 · x3)))/((x5 − x6) − x1)) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 13 Beispiel: Arithmetischer Ausdruck als Baum D = {+, −, ·, /} und Z = {x1, x2, x3, . . .}. / + − + − x2 x4 x9 / x7 x5 x5 − x3 x1 − x6 x6 x3 x1 ((((x2 · x4) + ((x3 − x7) − (x6/x1))) + (x5 · (x9 · x3)))/((x5 − x6) − x1)) Ausdruck: Tupeldarstellung ohne Kommas. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 13 Mathematische Struktur: rekursiv FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: (a) als geschachtelte Tripel FG KTuEA, TU Ilmenau oder Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: (a) als geschachtelte Tripel oder (b) als Zeichenreihen mit Symbolen aus D ∪ Z ∪ {(, ), “,00 }. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: (a) als geschachtelte Tripel oder (b) als Zeichenreihen mit Symbolen aus D ∪ Z ∪ {(, ), “,00 }. Auffassung (a) ist mathematisch etwas klarer, da zu gegebenem T = (T1, x, T2) die Komponenten T1, x und T2 unmittelbar gegeben sind (ohne Syntaxanalyse o.ä.). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: (a) als geschachtelte Tripel oder (b) als Zeichenreihen mit Symbolen aus D ∪ Z ∪ {(, ), “,00 }. Auffassung (a) ist mathematisch etwas klarer, da zu gegebenem T = (T1, x, T2) die Komponenten T1, x und T2 unmittelbar gegeben sind (ohne Syntaxanalyse o.ä.). Vorteil der rekursiven Auffassung: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: (a) als geschachtelte Tripel oder (b) als Zeichenreihen mit Symbolen aus D ∪ Z ∪ {(, ), “,00 }. Auffassung (a) ist mathematisch etwas klarer, da zu gegebenem T = (T1, x, T2) die Komponenten T1, x und T2 unmittelbar gegeben sind (ohne Syntaxanalyse o.ä.). Vorteil der rekursiven Auffassung: Übersichtlichere (rekursive) Programme und Korrektheitsüberlegungen. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: (a) als geschachtelte Tripel oder (b) als Zeichenreihen mit Symbolen aus D ∪ Z ∪ {(, ), “,00 }. Auffassung (a) ist mathematisch etwas klarer, da zu gegebenem T = (T1, x, T2) die Komponenten T1, x und T2 unmittelbar gegeben sind (ohne Syntaxanalyse o.ä.). Vorteil der rekursiven Auffassung: Übersichtlichere (rekursive) Programme und Korrektheitsüberlegungen. Vorteil der flachen Auffassung: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 Mathematische Struktur: rekursiv Beachte: Man kann die rekursiv definierten Binärbäume auf zwei letztendlich äquivalente Arten auffassen: (a) als geschachtelte Tripel oder (b) als Zeichenreihen mit Symbolen aus D ∪ Z ∪ {(, ), “,00 }. Auffassung (a) ist mathematisch etwas klarer, da zu gegebenem T = (T1, x, T2) die Komponenten T1, x und T2 unmittelbar gegeben sind (ohne Syntaxanalyse o.ä.). Vorteil der rekursiven Auffassung: Übersichtlichere (rekursive) Programme und Korrektheitsüberlegungen. Vorteil der flachen Auffassung: Eventuell effizientere Ausführung (Schleifen statt Prozeduraufrufe). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 14 (Rekursiver) Umbau von rekursiver zu flacher“ Struktur: ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 15 (Rekursiver) Umbau von rekursiver zu flacher“ Struktur: ” Wenn T = (z), dann ist die flache“ Version von T ein äußerer ” Knoten mit Inschrift z. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 15 (Rekursiver) Umbau von rekursiver zu flacher“ Struktur: ” Wenn T = (z), dann ist die flache“ Version von T ein äußerer ” Knoten mit Inschrift z. Dieser ist auch die Wurzel. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 15 (Rekursiver) Umbau von rekursiver zu flacher“ Struktur: ” Wenn T = (z), dann ist die flache“ Version von T ein äußerer ” Knoten mit Inschrift z. Dieser ist auch die Wurzel. Gegeben T = (T1, x, T2), stelle rekursiv (disjunkte) flache“ ” Versionen der beiden Unterbäume T1 und T2 her, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 15 (Rekursiver) Umbau von rekursiver zu flacher“ Struktur: ” Wenn T = (z), dann ist die flache“ Version von T ein äußerer ” Knoten mit Inschrift z. Dieser ist auch die Wurzel. Gegeben T = (T1, x, T2), stelle rekursiv (disjunkte) flache“ ” Versionen der beiden Unterbäume T1 und T2 her, mit Wurzeln r1 und r2. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 15 (Rekursiver) Umbau von rekursiver zu flacher“ Struktur: ” Wenn T = (z), dann ist die flache“ Version von T ein äußerer ” Knoten mit Inschrift z. Dieser ist auch die Wurzel. Gegeben T = (T1, x, T2), stelle rekursiv (disjunkte) flache“ ” Versionen der beiden Unterbäume T1 und T2 her, mit Wurzeln r1 und r2. Die Knotenmengen Vi und Li sowie die Funktionen leftchild i und rightchild i werden jeweils vereinigt, für i = 1, 2. Schließlich wird ein neuer innerer Knoten r mit Inschrift x erzeugt und leftchild (r) = r1 und rightchild (r) = r2 gesetzt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 15 Umbau von flacher“ zu rekursiver Struktur: ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Umbau von flacher“ zu rekursiver Struktur: ” Gegeben: Baum mit Knotenbeschriftungen als V , L, leftchild, rightchild, mV : V → D und mL : L → Z. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Umbau von flacher“ zu rekursiver Struktur: ” Gegeben: Baum mit Knotenbeschriftungen als V , L, leftchild, rightchild, mV : V → D und mL : L → Z. Falls die Wurzel r ein Blatt mit mL(r) = z ist: T = (z). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Umbau von flacher“ zu rekursiver Struktur: ” Gegeben: Baum mit Knotenbeschriftungen als V , L, leftchild, rightchild, mV : V → D und mL : L → Z. Falls die Wurzel r ein Blatt mit mL(r) = z ist: T = (z). Falls die Wurzel r ein innerer Knoten mit mV (r) = x ist: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Umbau von flacher“ zu rekursiver Struktur: ” Gegeben: Baum mit Knotenbeschriftungen als V , L, leftchild, rightchild, mV : V → D und mL : L → Z. Falls die Wurzel r ein Blatt mit mL(r) = z ist: T = (z). Falls die Wurzel r ein innerer Knoten mit mV (r) = x ist: Definiere V1 als die Menge der v ∈ V , deren Weg zur Wurzel durch leftchild(r) führt, analog L1 bei den Blättern. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Umbau von flacher“ zu rekursiver Struktur: ” Gegeben: Baum mit Knotenbeschriftungen als V , L, leftchild, rightchild, mV : V → D und mL : L → Z. Falls die Wurzel r ein Blatt mit mL(r) = z ist: T = (z). Falls die Wurzel r ein innerer Knoten mit mV (r) = x ist: Definiere V1 als die Menge der v ∈ V , deren Weg zur Wurzel durch leftchild(r) führt, analog L1 bei den Blättern. Analog V2 und L2 für Knoten, deren Weg zur Wurzel durch rightchild(r) führt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Umbau von flacher“ zu rekursiver Struktur: ” Gegeben: Baum mit Knotenbeschriftungen als V , L, leftchild, rightchild, mV : V → D und mL : L → Z. Falls die Wurzel r ein Blatt mit mL(r) = z ist: T = (z). Falls die Wurzel r ein innerer Knoten mit mV (r) = x ist: Definiere V1 als die Menge der v ∈ V , deren Weg zur Wurzel durch leftchild(r) führt, analog L1 bei den Blättern. Analog V2 und L2 für Knoten, deren Weg zur Wurzel durch rightchild(r) führt. V1, L1 mit den eingeschränkten Funktionen leftchild, rightchild, mV und mL bildet flachen“ Baum, ebenso V2, L2. ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Umbau von flacher“ zu rekursiver Struktur: ” Gegeben: Baum mit Knotenbeschriftungen als V , L, leftchild, rightchild, mV : V → D und mL : L → Z. Falls die Wurzel r ein Blatt mit mL(r) = z ist: T = (z). Falls die Wurzel r ein innerer Knoten mit mV (r) = x ist: Definiere V1 als die Menge der v ∈ V , deren Weg zur Wurzel durch leftchild(r) führt, analog L1 bei den Blättern. Analog V2 und L2 für Knoten, deren Weg zur Wurzel durch rightchild(r) führt. V1, L1 mit den eingeschränkten Funktionen leftchild, rightchild, mV und mL bildet flachen“ Baum, ebenso V2, L2. ” Transformiere diese beiden Bäume rekursiv in Bäume T1, T2 und setze T = (T1, x, T2). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 16 Implementierung I: (vgl. AuP-Vorlesung) Mit markierten externen Knoten. T: b z c b a 37 17 FG KTuEA, TU Ilmenau d 7 u r 29 31 1 13 3 23 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 17 Implementierung II: T: b z c d b a u r Externe Knoten werden nicht repräsentiert (NULL-Zeiger). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 18 Implementierung II: T: b z c d b a u r Externe Knoten werden nicht repräsentiert (NULL-Zeiger). Oder: 1 externer Knoten `, Zeiger auf ` statt NULL-Zeiger. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 18 Implementierung II: T: b z c d b a u r Externe Knoten werden nicht repräsentiert (NULL-Zeiger). Oder: 1 externer Knoten `, Zeiger auf ` statt NULL-Zeiger. Speicherplatzbedarf für n Knoten: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 18 Implementierung II: T: b z c d b a u r Externe Knoten werden nicht repräsentiert (NULL-Zeiger). Oder: 1 externer Knoten `, Zeiger auf ` statt NULL-Zeiger. Speicherplatzbedarf für n Knoten: n Dateneinträge, 2n Zeiger, davon n + 1 NULL-Zeiger. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 18 Mögliche Erweiterung: Vaterzeiger. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 19 Mögliche Erweiterung: Vaterzeiger. T: Wurzel b z c d b a FG KTuEA, TU Ilmenau u r Algorithmen und Datenstrukturen – SS12 – Kapitel 3 19 Mögliche Erweiterung: Vaterzeiger. T: Wurzel b z c d b a u r Erleichtert Navigieren im Baum, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 19 Mögliche Erweiterung: Vaterzeiger. T: Wurzel b z c d b a u r Erleichtert Navigieren im Baum, besonders bei Verwenden der flachen“ Auffassung und von iterativen Verfahren. ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 19 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: FG KTuEA, TU Ilmenau Elements Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: FG KTuEA, TU Ilmenau Elements Bintrees Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: FG KTuEA, TU Ilmenau Elements Bintrees Boolean Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: empty : → Bintrees FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: empty : → Bintrees buildTree: Elements × Bintrees × Bintrees → Bintrees FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: empty : → Bintrees buildTree: Elements × Bintrees × Bintrees → Bintrees leftSubtree: Bintrees → Bintrees FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: empty : → Bintrees buildTree: Elements × Bintrees × Bintrees → Bintrees leftSubtree: Bintrees → Bintrees rightSubtree: Bintrees → Bintrees FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: empty : → Bintrees buildTree: Elements × Bintrees × Bintrees → Bintrees leftSubtree: Bintrees → Bintrees rightSubtree: Bintrees → Bintrees data: Bintrees → Elements FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: empty : → Bintrees buildTree: Elements × Bintrees × Bintrees → Bintrees leftSubtree: Bintrees → Bintrees rightSubtree: Bintrees → Bintrees data: Bintrees → Elements isempty : Bintrees → Boolean FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Spezifikation von Binärbäumen Datentyp Binärbaum über D: (leere äußere Knoten) 1. Signatur: Sorten: Elements Bintrees Boolean Operationen: empty : → Bintrees buildTree: Elements × Bintrees × Bintrees → Bintrees leftSubtree: Bintrees → Bintrees rightSubtree: Bintrees → Bintrees data: Bintrees → Elements isempty : Bintrees → Boolean 2. Mathematisches Modell: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 20 Sorten: Elements: FG KTuEA, TU Ilmenau (nichtleere) Menge D Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: FG KTuEA, TU Ilmenau (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: Boolean: FG KTuEA, TU Ilmenau (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} {true, false} Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: Boolean: Op’en: empty () = FG KTuEA, TU Ilmenau (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} {true, false} (∗ leerer Baum ∗) Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: Boolean: (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} {true, false} Op’en: empty () = (∗ leerer Baum ∗) buildTree(x, T1, T2) := (T1, x, T2) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: Boolean: (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} {true, false} Op’en: empty () = (∗ leerer Baum ∗) buildTree(x, T1, T2) := (T1, x, T2) leftSubtree(T ) := FG KTuEA, TU Ilmenau T1, falls T = (T1, x, T2) undefiniert, falls T = Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: Boolean: (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} {true, false} Op’en: empty () = (∗ leerer Baum ∗) buildTree(x, T1, T2) := (T1, x, T2) T1, leftSubtree(T ) := undefiniert, T2, rightSubtree(T ) := undefiniert, FG KTuEA, TU Ilmenau falls T = (T1, x, T2) falls T = falls T = (T1, x, T2) falls T = Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: Boolean: (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} {true, false} Op’en: empty () = (∗ leerer Baum ∗) buildTree(x, T1, T2) := (T1, x, T2) T1, falls T = (T1, x, T2) leftSubtree(T ) := undefiniert, falls T = T2, falls T = (T1, x, T2) rightSubtree(T ) := undefiniert, falls T = x, falls T = (T1, x, T2) data(T ) := undefiniert, falls T = FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Sorten: Elements: Bintrees: Boolean: (nichtleere) Menge D {T | T ist (D, {−})-Binärbaum} {true, false} Op’en: empty () = (∗ leerer Baum ∗) buildTree(x, T1, T2) := (T1, x, T2) T1, falls T = (T1, x, T2) leftSubtree(T ) := undefiniert, falls T = T2, falls T = (T1, x, T2) rightSubtree(T ) := undefiniert, falls T = x, falls T = (T1, x, T2) data(T ) := undefiniert, falls T = false, falls T = (T1, x, T2) isempty (T ) := true, falls T = FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 21 Implementierung: empty, isempty, data, leftSubtree, rightSubtree: klar. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 22 Implementierung: empty, isempty, data, leftSubtree, rightSubtree: klar. buildTree(x, T1, T2) erzeugt einen neuen Knoten (Wurzel) r mit Eintrag x, die Wurzeln von T1 bzw. T2 werden linkes bzw. rechtes Kind von r. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 22 Implementierung: empty, isempty, data, leftSubtree, rightSubtree: klar. buildTree(x, T1, T2) erzeugt einen neuen Knoten (Wurzel) r mit Eintrag x, die Wurzeln von T1 bzw. T2 werden linkes bzw. rechtes Kind von r. Der Benutzer dieser Operation muss sicherstellen, dass die Knotenmengen von T1 und T2 disjunkt sind. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 22 3.2 Terminologie • Binärbaum, engl: binary tree“ ” • (innerer) Knoten v, engl: node“ ” • Knoteneintrag: x = data(v) = data(T 0) (v Wurzel von T 0) x v FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 23 • Tv : Unterbaum mit Wurzel v x v Tv Der Teil von T , der aus den Knoten besteht, deren Weg zur Wurzel durch v verläuft. Die Wurzel ist v. Dabei kann v ein beliebiger innerer oder äußerer Knoten sein. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 24 • (äußerer) Knoten ≡ Blatt l, engl: leaf “, Pl. leaves“ ” ” • Blatteintrag: z = data(l) z l • Wurzel, engl: root“ ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 25 • Vater ≡ (unmittelbarer) Vorgänger, engl: parent“, von v: p(v) ” • linkes Kind ≡ (unmittelbarer) Nachfolger, Sohn, engl: left child“, von v: leftchild(v) ” • rechtes Kind ≡ (unmittelbarer) Nachfolger, Sohn, engl: right child“, von v: rightchild(v) ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 26 • Vorfahr (Vater von Vater von Vater . . . von v), engl: ancestor“ (Im Bild: v ist Vorfahr von u.) ” • Nachfahr (Kind von Kind von . . . von v), engl: descendant“ (Im Bild: u ist Nachfahr von v.) ” v u Achtung: Oft gilt v als (uneigentlicher) Vorfahr/Nachfahr von v. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 27 • Weg in T : Knotenfolge oder Kantenfolge, die von v zu einem Nachfahren u führt • Länge eines Wegs (v0, v1, . . . , vs): Anzahl s der Kanten auf dem Weg v Weg der Länge 3 von v nach u u FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 28 Häufiger Spezialfall: Die externen Knoten haben keinen Eintrag. (Bzw. jeder hat denselben nichtssagenden Eintrag, z.B. −“ .) ” Ein solcher externer Knoten wird auch als leerer Baum“ ” bezeichnet. "Blätter" Oft bezeichnet man dann die inneren Knoten, die keinen inneren Knoten als Nachfolger haben, als Blätter“. ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 29 Tiefe/Level eines Knotens Die Länge (das ist die Kantenzahl) des Wegs (v0, v1, . . . , vd) von der Wurzel r = v0 zum Knoten v = vd heißt die Tiefe oder das Level d(v) von Knoten v. Auch externen Knoten wird so eine Tiefe zugeordnet. 0 1 2 d ( v )=3 v 3 4 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 30 Tiefe/Höhe eines Binärbaums Definition Die Tiefe oder Höhe d(T ) (auch: h(T )) eines Binärbaums T ist definiert wie folgt: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 31 Tiefe/Höhe eines Binärbaums Definition Die Tiefe oder Höhe d(T ) (auch: h(T )) eines Binärbaums T ist definiert wie folgt: 1. Fall: Die externen Knoten sind leer (): d(T ) = max({−1} ∪ {d(v) | v innerer Knoten in T }). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 31 Tiefe/Höhe eines Binärbaums Definition Die Tiefe oder Höhe d(T ) (auch: h(T )) eines Binärbaums T ist definiert wie folgt: 1. Fall: Die externen Knoten sind leer (): d(T ) = max({−1} ∪ {d(v) | v innerer Knoten in T }). Beobachte induktive Formel: d(T ) = −1 für T = und d((T1, x, T2)) = 1 + max{d(T1), d(T2)}. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 31 Beispiele: Tiefen/Höhen von Binärbäumen mit leeren Blättern. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 32 Beispiele: Tiefen/Höhen von Binärbäumen mit leeren Blättern. Höhe −1 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 Höhe 0 32 Beispiele: Tiefen/Höhen von Binärbäumen mit leeren Blättern. Höhe −1 Höhe 0 Höhe 3: x5 x2 T1 x6 x1 x4 T2 x7 x3 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 32 Tiefe/Höhe eines Binärbaums Definition der Tiefe/Höhe von T : 2. Fall: Die externen Knoten sind nicht leer ((z), z ∈ Z): d(T ) := max{d(v) | v äußerer Knoten in T }. 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Tiefe 4, gleich der maximalen Länge eines Weges zu einem Blatt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 33 Definition der Höhe eines Knotens: Die Höhe h(v) eines Knotens in T ist definiert als die Tiefe d(Tv ) des Teilbaums mit Wurzel v. – Beispiel: Höhe: 5 Höhe: 4 Höhe: 2 Höhe: 1 Höhe: 0 Hier angegeben: Fall Blätter nicht leer“. ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 34 3.3 Eigenschaften Proposition 3.3.1 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 35 3.3 Eigenschaften Proposition 3.3.1 Es sei T ein Binärbaum mit n ≥ 0 inneren Knoten und leeren äußeren Knoten. Dann gilt: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 35 3.3 Eigenschaften Proposition 3.3.1 Es sei T ein Binärbaum mit n ≥ 0 inneren Knoten und leeren äußeren Knoten. Dann gilt: (a) T hat 2n Zeiger/Kanten. (Beispiel: n = 10, 2n = 20) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 35 3.3 Eigenschaften Proposition 3.3.1 Es sei T ein Binärbaum mit n ≥ 0 inneren Knoten und leeren äußeren Knoten. Dann gilt: (a) (b) T hat 2n Zeiger/Kanten. (Beispiel: n = 10, 2n = 20) T hat n + 1 äußere Knoten. (Beispiel: n + 1 = 11) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 35 (c) Auf Level l liegen höchstens 2l Knoten, l = 0, 1, 2, . . .. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 36 (c) Auf Level l liegen höchstens 2l Knoten, l = 0, 1, 2, . . .. (d) Auf Level 0, 1, . . . , l zusammen liegen höchstens 1 + 2 + 4 + · · · + 2l FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 36 (c) Auf Level l liegen höchstens 2l Knoten, l = 0, 1, 2, . . .. (d) Auf Level 0, 1, . . . , l zusammen liegen höchstens 1 + 2 + 4 + · · · + 2l = 2l+1 − 1 innere Knoten. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 36 (c) Auf Level l liegen höchstens 2l Knoten, l = 0, 1, 2, . . .. (d) Auf Level 0, 1, . . . , l zusammen liegen höchstens 1 + 2 + 4 + · · · + 2l = 2l+1 − 1 innere Knoten. Daraus: log(n + 1) ≤ l + 1, für das Level l mit dem tiefsten inneren Knoten. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 36 (c) Auf Level l liegen höchstens 2l Knoten, l = 0, 1, 2, . . .. (d) Auf Level 0, 1, . . . , l zusammen liegen höchstens 1 + 2 + 4 + · · · + 2l = 2l+1 − 1 innere Knoten. Daraus: log(n + 1) ≤ l + 1, für das Level l mit dem tiefsten inneren Knoten. (e) n − 1 ≥ d(T ) ≥ dlog(n + 1)e − 1. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 36 (c) Auf Level l liegen höchstens 2l Knoten, l = 0, 1, 2, . . .. (d) Auf Level 0, 1, . . . , l zusammen liegen höchstens 1 + 2 + 4 + · · · + 2l = 2l+1 − 1 innere Knoten. Daraus: log(n + 1) ≤ l + 1, für das Level l mit dem tiefsten inneren Knoten. (e) n − 1 ≥ d(T ) ≥ dlog(n + 1)e − 1. Merke: Die Tiefe eines Binärbaums mit n inneren Knoten ist mindestens log n − 1. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 36 Proposition 3.3.2 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 37 Proposition 3.3.2 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 37 Proposition 3.3.2 Es sei T ein Binärbaum mit N ≥ 1 nichtleeren äußeren Knoten. Dann gilt: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 37 Proposition 3.3.2 Es sei T ein Binärbaum mit N ≥ 1 nichtleeren äußeren Knoten. Dann gilt: (a) T hat n = N − 1 innere Knoten. (Bsp.: N = 11, n = 10) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 37 Proposition 3.3.2 Es sei T ein Binärbaum mit N ≥ 1 nichtleeren äußeren Knoten. Dann gilt: (a) T hat n = N − 1 innere Knoten. (Bsp.: N = 11, n = 10) (b) T hat 2N − 2 Zeiger/Kanten. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 37 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 38 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 38 (c) N ≤ 2d(T ). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 38 (c) N ≤ 2d(T ). (Beweis: Induktion über Binärbaume, rekursive Struktur.) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 38 (c) N ≤ 2d(T ). (Beweis: Induktion über Binärbaume, rekursive Struktur.) (d) N − 1 ≥ d(T ) ≥ dlog N e. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 38 (c) N ≤ 2d(T ). (Beweis: Induktion über Binärbaume, rekursive Struktur.) (d) N − 1 ≥ d(T ) ≥ dlog N e. Merke: Die Tiefe eines Binärbaums mit N nichtleeren äußeren Knoten ist mindestens log N . FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 38 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0+2·1 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0+2·1+3·2+ FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0+2·1+3·2+3·3+ FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0 + 2 · 1 + 3 · 2 + 3 · 3 + 1 · 4 = 21 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0 + 2 · 1 + 3 · 2 + 3 · 3 + 1 · 4 = 21 Totale innere Weglänge ( total internal path length“): ” P TIPL(T ) := v∈V d(v) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0 + 2 · 1 + 3 · 2 + 3 · 3 + 1 · 4 = 21 Totale innere Weglänge ( total internal path length“): ” P TIPL(T ) := v∈V d(v) (Im Beispiel: 21) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0 + 2 · 1 + 3 · 2 + 3 · 3 + 1 · 4 = 21 Totale innere Weglänge ( total internal path length“): ” P TIPL(T ) := v∈V d(v) (Im Beispiel: 21) Mittlere innere Weglänge: FG KTuEA, TU Ilmenau 1 n ·TIPL(T ). Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale innere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem inneren Knoten einmal hinlaufe? 0 + 2 · 1 + 3 · 2 + 3 · 3 + 1 · 4 = 21 Totale innere Weglänge ( total internal path length“): ” P TIPL(T ) := v∈V d(v) (Im Beispiel: 21) Mittlere innere Weglänge: FG KTuEA, TU Ilmenau 1 n ·TIPL(T ). 21 (Im Beispiel 10 = 2,1.) Algorithmen und Datenstrukturen – SS12 – Kapitel 3 39 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2+3·3 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2+3·3+5·4 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2 + 3 · 3 + 5 · 4 + 2 · 5 = 41. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2 + 3 · 3 + 5 · 4 + 2 · 5 = 41. Totale äußere Weglänge ( total external path length“) ” P TEPL(T ) := l∈L d(l) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2 + 3 · 3 + 5 · 4 + 2 · 5 = 41. Totale äußere Weglänge ( total external path length“) ” P TEPL(T ) := l∈L d(l) (Im Beispiel: 41) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2 + 3 · 3 + 5 · 4 + 2 · 5 = 41. Totale äußere Weglänge ( total external path length“) ” P TEPL(T ) := l∈L d(l) (Im Beispiel: 41) Mittlere äußere Weglänge: TEPL(T )/(n + 1). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 40 Totale äußere Weglänge Wieviele Kanten durchlaufe ich insgesamt, wenn ich zu jedem äußeren Knoten einmal hinlaufe? 2 + 3 · 3 + 5 · 4 + 2 · 5 = 41. Totale äußere Weglänge ( total external path length“) ” P TEPL(T ) := l∈L d(l) (Im Beispiel: 41) Mittlere äußere Weglänge: TEPL(T )/(n + 1). (Im Beispiel FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 41 11 .) 40 Proposition 3.3.3 Für jeden Binärbaum mit n inneren Knoten gilt: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 41 Proposition 3.3.3 Für jeden Binärbaum mit n inneren Knoten gilt: TEPL(T ) = TIPL(T ) + 2n. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 41 Proposition 3.3.3 Für jeden Binärbaum mit n inneren Knoten gilt: TEPL(T ) = TIPL(T ) + 2n. FG KTuEA, TU Ilmenau (Im Beispiel: 41 = 21 + 2 · 10) Algorithmen und Datenstrukturen – SS12 – Kapitel 3 41 Proposition 3.3.3 Für jeden Binärbaum mit n inneren Knoten gilt: TEPL(T ) = TIPL(T ) + 2n. (Im Beispiel: 41 = 21 + 2 · 10) Beweis: Induktion über die Knotenanzahl von Binärbäumen. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 41 Proposition 3.3.3 Für jeden Binärbaum mit n inneren Knoten gilt: TEPL(T ) = TIPL(T ) + 2n. (Im Beispiel: 41 = 21 + 2 · 10) Beweis: Induktion über die Knotenanzahl von Binärbäumen. ( z ): z FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 41 Proposition 3.3.3 Für jeden Binärbaum mit n inneren Knoten gilt: TEPL(T ) = TIPL(T ) + 2n. (Im Beispiel: 41 = 21 + 2 · 10) Beweis: Induktion über die Knotenanzahl von Binärbäumen. ( z ): z I.A.: n = 0: TEPL(T ) = 0 und TIPL(T ) = 0. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 41 I.V.: n > 0, Beh. richtig für alle T 0 mit n0 < n inneren Knoten. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 42 I.V.: n > 0, Beh. richtig für alle T 0 mit n0 < n inneren Knoten. D. h.: TEPL(T 0) − TIPL(T 0) = 2n0. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 42 I.V.: n > 0, Beh. richtig für alle T 0 mit n0 < n inneren Knoten. D. h.: TEPL(T 0) − TIPL(T 0) = 2n0. I.S.: T = ( T ,x,T ): 1 2 x T1 FG KTuEA, TU Ilmenau T2 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 42 I.V.: n > 0, Beh. richtig für alle T 0 mit n0 < n inneren Knoten. D. h.: TEPL(T 0) − TIPL(T 0) = 2n0. I.S.: T = ( T ,x,T ): 1 2 x T1 T2 n1 = Anzahl innerer Knoten in T1; n2 = Anzahl innerer Knoten in T2. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 42 I.V.: n > 0, Beh. richtig für alle T 0 mit n0 < n inneren Knoten. D. h.: TEPL(T 0) − TIPL(T 0) = 2n0. I.S.: T = ( T ,x,T ): 1 2 x T1 T2 n1 = Anzahl innerer Knoten in T1; n2 = Anzahl innerer Knoten in T2. Klar: n = 1 + n1 + n2. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 42 Die n1 + 1 bzw. n2 + 1 externen Knoten in den Teilbäumen hängen in T ein Level tiefer: TEPL(T ) = (TEPL(T1) + (n1 + 1)) + (TEPL(T2) + (n2 + 1)). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 43 Die n1 + 1 bzw. n2 + 1 externen Knoten in den Teilbäumen hängen in T ein Level tiefer: TEPL(T ) = (TEPL(T1) + (n1 + 1)) + (TEPL(T2) + (n2 + 1)). Interne Knoten in den Teilbäumen hängen in T ein Level tiefer: TIPL(T ) = 0 +(TIPL(T1) + n1) + (TIPL(T2) + n2). |{z} Wurzel FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 43 Die n1 + 1 bzw. n2 + 1 externen Knoten in den Teilbäumen hängen in T ein Level tiefer: TEPL(T ) = (TEPL(T1) + (n1 + 1)) + (TEPL(T2) + (n2 + 1)). Interne Knoten in den Teilbäumen hängen in T ein Level tiefer: TIPL(T ) = 0 +(TIPL(T1) + n1) + (TIPL(T2) + n2). |{z} Wurzel Subtraktion liefert: TEPL(T ) − TIPL(T ) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 43 Die n1 + 1 bzw. n2 + 1 externen Knoten in den Teilbäumen hängen in T ein Level tiefer: TEPL(T ) = (TEPL(T1) + (n1 + 1)) + (TEPL(T2) + (n2 + 1)). Interne Knoten in den Teilbäumen hängen in T ein Level tiefer: TIPL(T ) = 0 +(TIPL(T1) + n1) + (TIPL(T2) + n2). |{z} Wurzel Subtraktion liefert: TEPL(T ) − TIPL(T ) = (TEPL(T1) − TIPL(T1)) + (TEPL(T2) − TIPL(T2)) + 2 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 43 Die n1 + 1 bzw. n2 + 1 externen Knoten in den Teilbäumen hängen in T ein Level tiefer: TEPL(T ) = (TEPL(T1) + (n1 + 1)) + (TEPL(T2) + (n2 + 1)). Interne Knoten in den Teilbäumen hängen in T ein Level tiefer: TIPL(T ) = 0 +(TIPL(T1) + n1) + (TIPL(T2) + n2). |{z} Wurzel Subtraktion liefert: TEPL(T ) − TIPL(T ) = I.V. = (TEPL(T1) − TIPL(T1)) + (TEPL(T2) − TIPL(T2)) + 2 2n1 + 2n2 + 2 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 43 Die n1 + 1 bzw. n2 + 1 externen Knoten in den Teilbäumen hängen in T ein Level tiefer: TEPL(T ) = (TEPL(T1) + (n1 + 1)) + (TEPL(T2) + (n2 + 1)). Interne Knoten in den Teilbäumen hängen in T ein Level tiefer: TIPL(T ) = 0 +(TIPL(T1) + n1) + (TIPL(T2) + n2). |{z} Wurzel Subtraktion liefert: TEPL(T ) − TIPL(T ) = I.V. = (TEPL(T1) − TIPL(T1)) + (TEPL(T2) − TIPL(T2)) + 2 2n1 + 2n2 + 2 = 2n. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 43 Nächstes Ziel: Auch die mittlere Weglänge in Binärbäumen wächst mindestens logarithmisch mit der Knotenanzahl. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 44 Nächstes Ziel: Auch die mittlere Weglänge in Binärbäumen wächst mindestens logarithmisch mit der Knotenanzahl. 0 0 0 C FG KTuEA, TU Ilmenau 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A Algorithmen und Datenstrukturen – SS12 – Kapitel 3 1 D 1 K 44 Nächstes Ziel: Auch die mittlere Weglänge in Binärbäumen wächst mindestens logarithmisch mit der Knotenanzahl. 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Lemma 3.3.4 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 44 Nächstes Ziel: Auch die mittlere Weglänge in Binärbäumen wächst mindestens logarithmisch mit der Knotenanzahl. 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Lemma 3.3.4 Es sei L die Menge der äußeren Knoten in einem Binärbaum T . FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 44 Nächstes Ziel: Auch die mittlere Weglänge in Binärbäumen wächst mindestens logarithmisch mit der Knotenanzahl. 0 0 0 C 1 1 0 H 1 1 F 0 G 0 E 0 1 0 B 1 1 I 0 A 1 D 1 K Lemma 3.3.4 Es sei L die Menge der äußeren Knoten in einem Binärbaum T . X Dann gilt: 2−d(l) = 1. l∈L FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 44 Beweis: Wie in einem Kodierungsbaum markiere in jedem inneren Knoten die Kante zum linken Kind mit 0, die zum rechten Kind mit 1. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 45 Beweis: Wie in einem Kodierungsbaum markiere in jedem inneren Knoten die Kante zum linken Kind mit 0, die zum rechten Kind mit 1. Dem Blatt l entspricht dann eine Bitfolge wl = b1 · · · bd(l). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 45 Beweis: Wie in einem Kodierungsbaum markiere in jedem inneren Knoten die Kante zum linken Kind mit 0, die zum rechten Kind mit 1. Dem Blatt l entspricht dann eine Bitfolge wl = b1 · · · bd(l). Sei D = d(T ) die Tiefe des tiefsten Blatts. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 45 Beweis: Wie in einem Kodierungsbaum markiere in jedem inneren Knoten die Kante zum linken Kind mit 0, die zum rechten Kind mit 1. Dem Blatt l entspricht dann eine Bitfolge wl = b1 · · · bd(l). Sei D = d(T ) die Tiefe des tiefsten Blatts. Jedes wl kann man auf 2D−d(l) Arten zu einer Bitfolge der Länge D verlängern. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 45 Beweis: Wie in einem Kodierungsbaum markiere in jedem inneren Knoten die Kante zum linken Kind mit 0, die zum rechten Kind mit 1. Dem Blatt l entspricht dann eine Bitfolge wl = b1 · · · bd(l). Sei D = d(T ) die Tiefe des tiefsten Blatts. Jedes wl kann man auf 2D−d(l) Arten zu einer Bitfolge der Länge D verlängern. Alle so erzeugten Bitfolgen sind verschieden; alle 2D Bitfolgen werden so erzeugt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 45 Beweis: Wie in einem Kodierungsbaum markiere in jedem inneren Knoten die Kante zum linken Kind mit 0, die zum rechten Kind mit 1. Dem Blatt l entspricht dann eine Bitfolge wl = b1 · · · bd(l). Sei D = d(T ) die Tiefe des tiefsten Blatts. Jedes wl kann man auf 2D−d(l) Arten zu einer Bitfolge der Länge D verlängern. Alle so erzeugten Bitfolgen sind verschieden; alle 2D Bitfolgen werden so erzeugt. X ⇒ 2D−d(l) = 2D . l∈L FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 45 Beweis: Wie in einem Kodierungsbaum markiere in jedem inneren Knoten die Kante zum linken Kind mit 0, die zum rechten Kind mit 1. Dem Blatt l entspricht dann eine Bitfolge wl = b1 · · · bd(l). Sei D = d(T ) die Tiefe des tiefsten Blatts. Jedes wl kann man auf 2D−d(l) Arten zu einer Bitfolge der Länge D verlängern. Alle so erzeugten Bitfolgen sind verschieden; alle 2D Bitfolgen werden so erzeugt. X ⇒ 2D−d(l) = 2D . l∈L ⇒ Behauptung. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 45 Proposition 3.3.5 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M FG KTuEA, TU Ilmenau P 1≤i≤M ai) ≥ 1 M P 1≤i≤M Algorithmen und Datenstrukturen – SS12 – Kapitel 3 log(ai). 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M P 1≤i≤M ai) ≥ 1 M P 1≤i≤M log(ai). Anwenden auf M = N = n + 1 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M P 1≤i≤M ai) ≥ 1 M P 1≤i≤M log(ai). Anwenden auf M = N = n + 1 und al = 2−d(l), l ∈ L: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M P 1≤i≤M ai) ≥ 1 M P 1≤i≤M log(ai). Anwenden auf M = N = n + 1 und al = 2−d(l), l ∈ L: P 1 log( N l∈L 2−d(l)) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M P 1≤i≤M ai) ≥ 1 M P 1≤i≤M log(ai). Anwenden auf M = N = n + 1 und al = 2−d(l), l ∈ L: P P 1 1 −d(l) log( N l∈L 2 ) ≥ N l∈L(−d(l)) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M P 1≤i≤M ai) ≥ 1 M P 1≤i≤M log(ai). Anwenden auf M = N = n + 1 und al = 2−d(l), l ∈ L: P P 1 1 −d(l) log( N l∈L 2 ) ≥ N l∈L(−d(l)) D.h.: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M P 1≤i≤M ai) ≥ 1 M P 1≤i≤M log(ai). Anwenden auf M = N = n + 1 und al = 2−d(l), l ∈ L: P P 1 1 −d(l) log( N l∈L 2 ) ≥ N l∈L(−d(l)) X P 2−d(l) D.h.: TEPL(T ) = l∈L d(l) ≥ −N log N1 |l∈L {z =1 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 } 46 Proposition 3.3.5 T hat N = n + 1 äußere Knoten ⇒ TEPL(T ) ≥ N log N . Beweis: Die Logarithmusfunktion ist konkav : log((1 − λ)a + λb)) ≥ (1 − λ) log a + λ log b, für alle λ ∈ [0,1]. Daraus: 1 log( M P 1≤i≤M ai) ≥ 1 M P 1≤i≤M log(ai). Anwenden auf M = N = n + 1 und al = 2−d(l), l ∈ L: P P 1 1 −d(l) log( N l∈L 2 ) ≥ N l∈L(−d(l)) X P 2−d(l) D.h.: TEPL(T ) = l∈L d(l) ≥ −N log N1 |l∈L {z =1 Der letzte Term ist = −N log( N1 ) = N log(N ). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 } 46 Ergebnis: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 47 Ergebnis: Mittlere äußere Weglänge ist ≥ log(Blattanzahl). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 47 Ergebnis: Mittlere äußere Weglänge ist ≥ log(Blattanzahl). Nach Proposition 3.3.3: TEPL(T ) = TIPL(T ) + 2n FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 47 Ergebnis: Mittlere äußere Weglänge ist ≥ log(Blattanzahl). Nach Proposition 3.3.3: TEPL(T ) = TIPL(T ) + 2n Also: TIPL(T ) ≥ TEPL(T )−2n ≥ (n+1) log(n+1)−2n > n(log n−2). Mittlere innere Weglänge ist ≥ log(Knotenanzahl) − 2. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 47 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T ) löst Abarbeitung einer Methode von data(T ) aus. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T ) löst Abarbeitung einer Methode von data(T ) aus. Möglichkeiten für visit bei Knoten v: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T ) löst Abarbeitung einer Methode von data(T ) aus. Möglichkeiten für visit bei Knoten v: – Daten data(v) ausgeben; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T ) löst Abarbeitung einer Methode von data(T ) aus. Möglichkeiten für visit bei Knoten v: – Daten data(v) ausgeben; – laufende Nummer für v vergeben; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T ) löst Abarbeitung einer Methode von data(T ) aus. Möglichkeiten für visit bei Knoten v: – Daten data(v) ausgeben; – laufende Nummer für v vergeben; – Zeiger auf v an Liste anhängen; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T ) löst Abarbeitung einer Methode von data(T ) aus. Möglichkeiten für visit bei Knoten v: – Daten data(v) ausgeben; – laufende Nummer für v vergeben; – Zeiger auf v an Liste anhängen; – zu v gehörende Aktion ausführen FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 3.4 Durchläufe durch Binärbäume (D, Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation: organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T ) löst Abarbeitung einer Methode von data(T ) aus. Möglichkeiten für visit bei Knoten v: – Daten data(v) ausgeben; – laufende Nummer für v vergeben; – Zeiger auf v an Liste anhängen; – zu v gehörende Aktion ausführen (z. B. arithmetische Operation durchführen) usw. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 48 Inorder-Durchlauf durch T falls T = (z): e-visit(z) ; FG KTuEA, TU Ilmenau (∗ besuche äußeren Knoten ∗) Algorithmen und Datenstrukturen – SS12 – Kapitel 3 49 Inorder-Durchlauf durch T falls T = (z): e-visit(z) ; (∗ besuche äußeren Knoten ∗) falls T = (T1, x, T2): FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 49 Inorder-Durchlauf durch T falls T = (z): e-visit(z) ; (∗ besuche äußeren Knoten ∗) falls T = (T1, x, T2): Inorder-Durchlauf durch T1; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 49 Inorder-Durchlauf durch T falls T = (z): e-visit(z) ; (∗ besuche äußeren Knoten ∗) falls T = (T1, x, T2): Inorder-Durchlauf durch T1; i-visit(x) ; (∗ besuche inneren Knoten ∗) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 49 Inorder-Durchlauf durch T falls T = (z): e-visit(z) ; (∗ besuche äußeren Knoten ∗) falls T = (T1, x, T2): Inorder-Durchlauf durch T1; i-visit(x) ; (∗ besuche inneren Knoten ∗) Inorder-Durchlauf durch T2. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 49 Inorder-Durchlauf durch T b c 7 b 37 d u 29 a 17 FG KTuEA, TU Ilmenau z 31 13 r 1 3 23 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 50 Inorder-Durchlauf durch T b c 7 b 37 FG KTuEA, TU Ilmenau d u 29 a 17 Ausgabe: z 31 13 r 1 3 23 37, b, 17, a, 31, c, 7, b, 29, d, 1, r, 23, z, 13, u, 3 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 50 Inorder-Durchlauf durch T b c z 7 b 37 u 29 a 17 d 31 13 r 1 3 23 Ausgabe: 37, b, 17, a, 31, c, 7, b, 29, d, 1, r, 23, z, 13, u, 3 Beobachte: Abwechselnd externe und interne Knoten. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 50 Präorder-Durchlauf durch T falls T = (z): e-visit(z) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 51 Präorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 51 Präorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): i-visit(x) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 51 Präorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): i-visit(x) ; Präorder-Durchlauf durch T1; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 51 Präorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): i-visit(x) ; Präorder-Durchlauf durch T1; Präorder-Durchlauf durch T2; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 51 Präorder-Durchlauf durch T b c 7 b 37 d u 29 a 17 FG KTuEA, TU Ilmenau z 31 13 r 1 3 23 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 52 Präorder-Durchlauf durch T b c 7 b 37 FG KTuEA, TU Ilmenau d u 29 a 17 Ausgabe: z 31 13 r 1 3 23 b, c, b, 37, a, 17, 31, 7, z, d, 29, r, 1, 23, u, 13, 3 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 52 Postorder-Durchlauf durch T falls T = (z): e-visit(z) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 53 Postorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 53 Postorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): Postorder-Durchlauf durch T1; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 53 Postorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): Postorder-Durchlauf durch T1; Postorder-Durchlauf durch T2; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 53 Postorder-Durchlauf durch T falls T = (z): e-visit(z) ; falls T = (T1, x, T2): Postorder-Durchlauf durch T1; Postorder-Durchlauf durch T2; i-visit(x) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 53 Postorder-Durchlauf durch T b c 7 b 37 d u 29 a 17 FG KTuEA, TU Ilmenau z 31 13 r 1 3 23 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 54 Postorder-Durchlauf durch T b c 7 b 37 FG KTuEA, TU Ilmenau d u 29 a 17 Ausgabe: z 31 13 r 1 3 23 37, 17, 31, a, b, 7, c, 29, 1, 23, r, d, 13, 3, u, z, b Algorithmen und Datenstrukturen – SS12 – Kapitel 3 54 Beispiel: Arithmetischer Ausdruck als Baum D = {+, −, ·, /} und Z = {x1, x2, x3, . . .}. / + − + − x2 x4 FG KTuEA, TU Ilmenau x9 / x7 x5 x5 − x3 x1 − x6 x6 x3 x1 Algorithmen und Datenstrukturen – SS12 – Kapitel 3 55 Beispiel: Arithmetischer Ausdruck als Baum D = {+, −, ·, /} und Z = {x1, x2, x3, . . .}. / −5 40 + − −30 + 3 −9 −7 − −2 7 2 5 − 10 − −7 −3 70 −21 10 / −5 −8 7 5 10 −2 5 Ordne den Blättern konkrete Werte zu, z.B. x1 = 5, x2 = 3, x3 = −2, x4 = −7, x5 = 7, x6 = 10, x7 = 5, x9 = −5. Auswertungsprozedur ordnet jedem Knoten einen Wert zu. Geeignete Reihenfolge: Postorder-Durchlauf. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 56 Auch möglich: Kombi-Durchlauf: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; falls T = (T1, x, T2): FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; falls T = (T1, x, T2): preord-i-visit(x) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; falls T = (T1, x, T2): preord-i-visit(x) ; Kombi-Durchlauf durch T1; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; falls T = (T1, x, T2): preord-i-visit(x) ; Kombi-Durchlauf durch T1; inord-i-visit(x) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; falls T = (T1, x, T2): preord-i-visit(x) ; Kombi-Durchlauf durch T1; inord-i-visit(x) ; Kombi-Durchlauf durch T2; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; falls T = (T1, x, T2): preord-i-visit(x) ; Kombi-Durchlauf durch T1; inord-i-visit(x) ; Kombi-Durchlauf durch T2; postord-i-visit(x) ; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Auch möglich: Kombi-Durchlauf: falls T = (z): e-visit(z) ; falls T = (T1, x, T2): preord-i-visit(x) ; Kombi-Durchlauf durch T1; inord-i-visit(x) ; Kombi-Durchlauf durch T2; postord-i-visit(x) ; Ermöglicht Datentransport von der Wurzel nach unten in den Baum hinein und wieder zurück. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 57 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. Beispiel: Inorder-Durchlauf. Prozedur: inorder(T) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. Beispiel: Inorder-Durchlauf. Prozedur: inorder(T) Angewendet auf einen Baum T mit n inneren Knoten. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. Beispiel: Inorder-Durchlauf. Prozedur: inorder(T) Angewendet auf einen Baum T mit n inneren Knoten. Für jeden inneren und äußeren Knoten wird die Prozedur inorder(.) einmal aufgerufen, FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. Beispiel: Inorder-Durchlauf. Prozedur: inorder(T) Angewendet auf einen Baum T mit n inneren Knoten. Für jeden inneren und äußeren Knoten wird die Prozedur inorder(.) einmal aufgerufen, insgesamt (2n + 1)-mal. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. Beispiel: Inorder-Durchlauf. Prozedur: inorder(T) Angewendet auf einen Baum T mit n inneren Knoten. Für jeden inneren und äußeren Knoten wird die Prozedur inorder(.) einmal aufgerufen, insgesamt (2n + 1)-mal. Kosten pro Aufruf: O(1) plus Kosten für i-visit/e-visit-Operation. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. Beispiel: Inorder-Durchlauf. Prozedur: inorder(T) Angewendet auf einen Baum T mit n inneren Knoten. Für jeden inneren und äußeren Knoten wird die Prozedur inorder(.) einmal aufgerufen, insgesamt (2n + 1)-mal. Kosten pro Aufruf: O(1) plus Kosten für i-visit/e-visit-Operation. Insgesamt: (2n + 1) · (O(1) + Cvisit), wo Cvisit eine Schranke für die Kosten der visit-Operationen ist. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Zeitanalyse für Durchlauf Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. Beispiel: Inorder-Durchlauf. Prozedur: inorder(T) Angewendet auf einen Baum T mit n inneren Knoten. Für jeden inneren und äußeren Knoten wird die Prozedur inorder(.) einmal aufgerufen, insgesamt (2n + 1)-mal. Kosten pro Aufruf: O(1) plus Kosten für i-visit/e-visit-Operation. Insgesamt: (2n + 1) · (O(1) + Cvisit), wo Cvisit eine Schranke für die Kosten der visit-Operationen ist. Baumdurchläufe haben lineare Laufzeit. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 58 Levelorder-Durchlauf a 0: c 1: a 2: 3: FG KTuEA, TU Ilmenau e d c c d b Algorithmen und Datenstrukturen – SS12 – Kapitel 3 d f 59 Levelorder-Durchlauf a 0: c 1: a 2: 3: e d c c d b d f Wunschausgabe: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 59 Levelorder-Durchlauf a 0: c 1: a 2: 3: e d c c d b d f Wunschausgabe: acdaccedbdf FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 59 Levelorder-Durchlauf a 0: c 1: a 2: 3: e d c c d b d f Wunschausgabe: acdaccedbdf zeilenweise von links nach rechts“ ” FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 59 Levelorder-Durchlauf a 0: c 1: a 2: 3: e d c c d b d f Wunschausgabe: acdaccedbdf zeilenweise von links nach rechts“ ” Benutze Queue Q, die Zeiger/Referenzen auf Binärbaumknoten speichern kann. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 59 Prozedur Leveldurchlauf (leere äußere Knoten) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; enqueue(p); FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; enqueue(p); (13) p ← w.rightchild; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; enqueue(p); (13) p ← w.rightchild; (14) if p <> NIL then FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; enqueue(p); (13) p ← w.rightchild; (14) if p <> NIL then (15) count++; p.lnum ← count; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; enqueue(p); (13) p ← w.rightchild; (14) if p <> NIL then (15) count++; p.lnum ← count; (∗ entdecke p∗) FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; enqueue(p); (13) p ← w.rightchild; (14) if p <> NIL then (15) count++; p.lnum ← count; (∗ entdecke p∗) (16) p.level ← w.level + 1; FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Prozedur Leveldurchlauf (leere äußere Knoten) Eingabe: v: node; (∗ Wurzel ∗) (1) Q: Queue für node; (2) count ← 0; (3) if v <> NIL then (∗ entdecke v∗) (4) count++; v.lnum ← count; (5) v.level ← 0; enqueue(v); (6) while not Q.isempty repeat (7) w ← Q.first; Q.dequeue; (8) visit(w); (∗ bearbeite w∗) (9) p ← w.leftchild; (10) if p <> NIL then (11) count++; p.lnum ← count; (∗ entdecke p∗) (12) p.level ← w.level + 1; enqueue(p); (13) p ← w.rightchild; (14) if p <> NIL then (15) count++; p.lnum ← count; (∗ entdecke p∗) (16) p.level ← w.level + 1; enqueue(p); FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 60 Behauptung 3.4.2 FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61 Behauptung 3.4.2 FG KTuEA, TU Ilmenau Lineare Zeit, Korrektheit“ ” Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61 Behauptung 3.4.2 Lineare Zeit, Korrektheit“ ” (a) Levelorder-Durchlauf benötigt Zeit n · tvisit + O(n), wobei tvisit die Zeit für visit angibt. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61 Behauptung 3.4.2 Lineare Zeit, Korrektheit“ ” (a) Levelorder-Durchlauf benötigt Zeit n · tvisit + O(n), wobei tvisit die Zeit für visit angibt. (b) Der Levelorder-Durchlauf ordnet jedem Binärbaumknoten v (in v.level) korrekt seine Tiefe zu. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61 Behauptung 3.4.2 Lineare Zeit, Korrektheit“ ” (a) Levelorder-Durchlauf benötigt Zeit n · tvisit + O(n), wobei tvisit die Zeit für visit angibt. (b) Der Levelorder-Durchlauf ordnet jedem Binärbaumknoten v (in v.level) korrekt seine Tiefe zu. Beweis: Man zeigt durch Induktion über das Level von v: FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61 Behauptung 3.4.2 Lineare Zeit, Korrektheit“ ” (a) Levelorder-Durchlauf benötigt Zeit n · tvisit + O(n), wobei tvisit die Zeit für visit angibt. (b) Der Levelorder-Durchlauf ordnet jedem Binärbaumknoten v (in v.level) korrekt seine Tiefe zu. Beweis: Man zeigt durch Induktion über das Level von v: Jeder innere Knoten v des Binärbaums wird genau einmal in die Queue eingefügt, genau einmal entnommen und im Schleifenrumpf (7)-(16) bearbeitet. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61 Behauptung 3.4.2 Lineare Zeit, Korrektheit“ ” (a) Levelorder-Durchlauf benötigt Zeit n · tvisit + O(n), wobei tvisit die Zeit für visit angibt. (b) Der Levelorder-Durchlauf ordnet jedem Binärbaumknoten v (in v.level) korrekt seine Tiefe zu. Beweis: Man zeigt durch Induktion über das Level von v: Jeder innere Knoten v des Binärbaums wird genau einmal in die Queue eingefügt, genau einmal entnommen und im Schleifenrumpf (7)-(16) bearbeitet. Dabei wird die korrekte Levelnummer vergeben. FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61 Behauptung 3.4.2 Lineare Zeit, Korrektheit“ ” (a) Levelorder-Durchlauf benötigt Zeit n · tvisit + O(n), wobei tvisit die Zeit für visit angibt. (b) Der Levelorder-Durchlauf ordnet jedem Binärbaumknoten v (in v.level) korrekt seine Tiefe zu. Beweis: Man zeigt durch Induktion über das Level von v: Jeder innere Knoten v des Binärbaums wird genau einmal in die Queue eingefügt, genau einmal entnommen und im Schleifenrumpf (7)-(16) bearbeitet. Dabei wird die korrekte Levelnummer vergeben. Weil Queue-Operationen Zeit O(1) benötigen, ist der restliche Zeitbedarf O(n). FG KTuEA, TU Ilmenau Algorithmen und Datenstrukturen – SS12 – Kapitel 3 61