Definition ● Bäume sind verallgemeinerte Listen – Datenstrukturen Teil 2 ● Bäume ● Jeder Knoten kann mehrere Nachfolger haben Sie sind weiter spezielle Graphen – Graphen bestehen aus Knoten und Kanten – Kanten können gerichtet und ungerichtet sein – Graphen können zyklisch oder azyklisch sein Ein Baum ist ein azyklischer zusammenhängender Graph – Alle Knoten sind durch Kanten miteinander ohne „Kreis“ verbunden Definition ● Bäume werden als Datenstruktur zur hierarchischen Gliederung von Daten genutzt Definition ● Bäume (als Graphen) können – Ungerichtet sein (keine dedizierte Wurzel) 5 6 4 – Suchbäume – Entscheidungsbäume – Codierungsbäume – – ● Grammatikbäume Etc. Viele wichtige und elementare Algorithmen nutzen Bäume -> Sehr wichtige Datenstruktur 1 3 2 – Gewurzelt sein (dedizierter Wurzelknoten) Wurzel 4 5 6 3 1 2 Definition ● Bäume haben die Eigenschaften: – Von jedem Knoten gibt es genau einen Pfad zurück zur Wurzel – Vater (Vorgänger) eines Knotens ist der direkte Nachbar auf dem Pfad vom Knoten zur Wurzel – Kinder (Nachfolger) sind alle anderen Nachbarn des Knotens – Nachbar bedeutet hier, ein durch eine Kante mit dem Knoten verbundener anderer Knoten Definition ● Die Wurzel eines Baumes ist der einzige Knoten ohne Vorgänger ● Knoten ohne Nachfolger nennt man Blätter ● Alle anderen Knoten eines Baumes heissen innere Knoten ● Im allgemeinen bezeichnet „Baum“ einen Wurzelbaum, meist sogar einen gerichteten Definition der Eigenschaften von Bäumen Beispiele Baum kein Baum kein Baum (aber zwei Bäume) ● Tiefe eines Knotens / Blatts: Anzahl der Kanten von der Wurzel bis zum Knoten ● Höhe eines Baumes: Die größte Tiefe eines Knotens des Baumes ● Niveau x: Alle Knoten mit der Tiefe x ● Vollständiger Baum: Alle Blätter haben die selbe Tiefe Definition der Eigenschaften von Bäumen ● Ordnung eines Baumes – Wird durch eine Relation zwischen den Knoten eines Baumes definiert – Beispiel: < - Relation auf Niveauebene ● Anwendungsbeispiel Suchbaum ● Basis ist ein binärer Baum ● Jeder Knoten hat max. 2 Nachfolger ● Jeder Knoten hat drei Datensätze: Bedeutet, dass jeder Niveaunachbar auf der linken Seite eines Knotens einen kleineren Datenwert enthält, als der Knoten selbst 5 3 < < 8 9 < 19 ● Der Baum soll die < - Ordnung auf Niveaunachbarebene besitzen ● Damit kann ein effizienter Suchalgorithmus implementiert werden 27 15 14 Ein Verweis (Zeiger) auf den linken Nachfolger – Ein Verweis(Zeiger) auf den rechten Nachfolger Anwendungsbeispiel Suchbaum ● 39 1 – 35 Anwendungsbeispiel Suchbaum 3 Das eigentliche Datum (z.B. ein Integer) 17 < Wurzel – Der Suchalgorithmus im Pseudocode: k = wurzel; while (k != null) { if (s == k.key) return true; if (s < k.key) k = k.left; else k = k.right } return false; Anwendungsbeispiel Suchbaum ● Ablauf: – Wurzel wird als Startknoten angegeben – Der Suchwert wird mit dem im Knoten gespeicherten Wert verglichen – Bei Gleichheit bricht der Algorithmus erfolgreich ab – Gespeicherter Wert größer -> Nächster Knoten der linke Nachfolger – Gespeicherter Wert kleiner -> Nächster Knoten der rechte Nachbar – Gibt es keinen Nachfolger mehr, bricht der Algorithmus ohne Ergebnis ab Anwendungsbeispiel Suchbaum ● Codebeispiel für Datenstruktur class SearchNode { int content; SearchNode left; SearchNode right; SearchNode (int c){ // Konstruktor content = c; // Nachfolger resetten left = right = null; } } class SearchTree SearchNode SearchTree root = } } { root; () { // Konstruktor fuer leeren Baum null; Anwendungsbeispiel Suchbaum ● Codebeispiel für Suche Operationen im Baum ● /* Suche nach c im Baum */ boolean search (int c) { return search (root, c); } boolean search (SearchNode n, int c){ while (n != null) { if (c == n.content) return true; if (c < n.content) n = n.left; else n = n.right; } return false; } ● Alle Operationen (Einfügen, Löschen, Sortieren) sind abhängig von – Der Art des Baums (binär oder höher) – Der Ordung – Der Zusatzanforderungen (z.B. balanciert) Einfügen – Erklärung am vorangegangenen Beispiel – Suche zunächst nach dem neuen Wert um Doppeleinträge zu vermeiden – Wird der neue Wert nicht gefunden, wird er an das letzte Blatt der Suche angehängt Operationen im Baum - Einfügen ● Operationen im Baum - Einfügen Im Binärbaum mit < - Ordnung wird der Wert 5 eingefügt ● Dieses „naive“ Einfügen kann zur Entartung des Baumes führen Einfügen 5 ● Reihenfolge des Einfügens definiert die Struktur des Baumes 9 3 12 9 3 4 12 1 4 3 5 15 14 – Ablauf: Wurzel->Vergleich mit 5 -> 9 > 5 -> Linker Knoten->Vergleich mit 5 -> 3 < 5 -> rechter Knoten->Vergleich mit 5 -> 4 < 5 -> eigentlich nun rechten Knoten vergleichen -> existiert nicht -> 5 als rechten Knoten einfügen Operationen im Baum - Entfernen • Entfernen eines Knotens k mit Wert s aus einem Baum (Beibehaltung der Suchbaum Eigenschaft) • Suche nach s, falls nicht da: fertig; sonst endet die Suche mit Knoten k und • k hat keinen, einen oder zwei Söhne: • (a) kein Sohn: fertig, Vater bekommt Zeiger auf null • (b) nur ein Sohn ist da : lasse Vater v von k darauf statt auf k zeigen • (c) zwei Söhne: suche kleinsten Wert in rechtem Teilbaum, d.h. mache einen Schritt nach rechts und beliebig viele nach links bis zu p (symmetrischer Nachfolger von k); kopiere Wert s von p nach k, lösche p (max. einen Sohn, also nach a, b behandeln) 3 39 15 1 14 27 27 15, 39, 3, 27, 1, 14 39 1, 3, 14, 15, 27, 39