Lektion 5: Bäume + × Helmar Burkhart Informatik Universität Basel [email protected] Institut für Informatik Universität Basel − 1 × 5 3 + − 2 3 4 Algorithmen und Datenstrukturen Lektion 5: Bäume 6 5-0 Konzept Baum • Ein Baum stellt eine hierarchische Beziehung zwischen Datenelementen dar. Begriffe: • Knoten und Kante A • Blatt bzw. interner Knoten B C • Wurzel (root) • Eltern (parent) D E F G • Kind (child), Grad (degree) • Geschwister (sibling) Anzahl Kanten = Anzahl Knoten -1 • Tiefe (depth) und Höhe (height) • Ebene (level) Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-1 Bäume in der Bibliothek JDSL http://www.cs.brown.edu/cgc/jdsl Container EulerTour PositionalContainer InOrderIterator InspectableTree Tree InspectableBinaryTree BinaryTree NodeBinaryTree Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-2 ADT Nichtveränderbarer Baum (1) Es werden zu einem gegebenen Knoten eines Baums Nachbarschaftsrelationen und Eigenschaften zugreifbar gemacht. interface InspectableTree • boolean isExternal(Position node) • boolean isInternal(Position node) • boolean isRoot(Position node) • Position firstChild(Position node) • Position lastChild(Position node) • Position childAtRank(Position node, int rank) Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-3 ADT Nichtveränderbarer Baum (2) • • • • int PositionIterator int Position rankOfChild(Position child) children(Position node) numChildren(Position node) parent(Position node) • • • • Position Position Position PositionIterator root() siblingBefore(Position node) siblingAfter(Position node) siblings(Position node) Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-4 ADT Veränderbarer Baum (1) Die Schnittstelle Tree stellt Operationen zur Veränderung eines Baums bereit. interface Tree extends InspectableTree • Position insertChildAtRank(Position node, int rank, Object elem) • Position insertFirstChild(Position node, • Position • Position • Position Institut für Informatik Universität Basel Object elem) insertLastChild(Position node,...) insertAfterSibling(Position node,...) insertBeforeSibling(Position node,...) Algorithmen und Datenstrukturen Lektion 5: Bäume 5-5 ADT Veränderbarer Baum (2) • Object • Tree • Position • Object • Object • Tree Institut für Informatik Universität Basel contract(Position node) cut(Position node) expand(Position fromChild, Position toChild, Object elem) link(Position extNode, Tree t) removeExternal(Position node) replaceSubtree(Position node, Tree t) Algorithmen und Datenstrukturen Lektion 5: Bäume 5-6 Konzept Binärer Baum Ein binärer Baum ist ein Baum bei dem alle internen Knoten den Grad 2 haben. Rekursive Definition: Ein binärer Baum ist entweder ein Blatt oder ein interner Knoten mit 2 Kindern, die selber binäre Bäume sind. Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-7 Eigenschaften binärer Bäume • Anzahl Blätter = Anzahl interne Knoten + 1. • Anzahl Knoten auf Ebene i ist kleiner oder gleich 2i • Anzahl der Blätter ist kleiner oder gleich 2h wobei h die Höhe des Baums ist. Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-8 ADT Nichtveränderbarer binärer Baum interface InspectableBinaryTree extends InspectableTree • Position leftChild(Position node) • Position rightChild(Position node) • Position sibling(Position node) Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-9 ADT Veränderbarer binärer Baum interface BinaryTree extends InspectableBinaryTree • BinaryTree cut(Position node) • void expandExternal(Position node) • void graftOnLeft(Position subtreeRoot, Object eltOfParent, BinaryTree newSubtree) • void graftOnRight(...) • Object link(Position node, BinaryTree newSubtree) • void removeAboveExternal(Position node) • BinaryTree replaceSubtree(Position subtreeRoot, BinaryTree newSubtree) Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-10 Beispiel Binärer Baum Ein Anwendung binärer Bäume ist die Speicherung arithmetischer Ausdrücke. + × × (1-3)× 5 + (2+3)×(4-6) − PostorderTraversieren liefert die Polnische Notation: Institut für Informatik Universität Basel 1 Algorithmen und Datenstrukturen Lektion 5: Bäume 5 3 − + 2 3 4 6 5-11 Binärer Baum mittels Folge Wir nummerieren die Knoten wie folgt: • Wurzel erhält Nummer 1. • Der Knoten k habe die Nummer p(k). Das linke Kind erhält Nummer 2 × p(k), das rechte 2 × p(k) +1 Nummer wird als Rang verwendet. Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-12 Binärer Baum mittels Verkettungen (1) class T_Node extends D-Node implements Position{ private T_Node parent; // Konstruktor public T_Node(Object e, T_Node p, T_Node l, T_Node r){ super(e,l,r); parent = p; } Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-13 Binärer Baum mittels Verkettungen (2) root Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-14 Traversieren von Bäume Es gibt verschiedene Strategien zum Besuchen der Knoten in einem Baum: • Breitensuche (breadth-first) • Tiefensuche (depth-first) – Präorder-Strategie: "Knoten am Anfang besuchen" – Postorder-Strategie: "Knoten am Schluss besuchen" – Inorder-Strategie: "Knoten zwischendurch besuchen" Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-15 Traversieren mit Präorder-Strategie Präorder-Strategie: "Knoten am Anfang besuchen" Algorithmus Präorder(Knoten k) "besuche" k forall c ∈ Kind(k) do Präorder(c) Anwendung: Hierarchisches Dokument (Buch) von Anfang bis Ende lesen. Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-16 Traversieren mit Postorder-Strategie Postorder-Strategie: "Knoten am Schluss besuchen" Algorithmus Postorder(Knoten k) forall c ∈ Kind(k) do Postorder(c) "besuche" k Anwendung: Speicherverbrauch in Unterverzeichnissen berechnen. Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-17 Traversieren mit Inorder-Strategie Inorder-Strategie: "Knoten zwischendurch besuchen" Algorithmus Inorder(Knoten k) nc ← Anzahl_Kinder(k) Inorder(1. Kind) for i ← 2 to nc do "Besuche" k Inorder(i. tes Kind) Institut für Informatik Universität Basel Anwendung: Arithmetische Berechnungen Algorithmen und Datenstrukturen Lektion 5: Bäume 5-18 Euler Tour Die Euler-Tour ist ein Rundgang durch den Baum, wobei jeder interne Knoten 3 Mal besucht wird: • von links kommend • von unten kommend • von rechts kommend Alle vorher genannten Traversierstrategien sind Spezialisierungen der Euler-Tour. Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-19 Klasse Euler Tour abstract class EulerTour • • • • • • void void void void void void execute(InspectableTree tree) init() visitBetweenChildren(Position pos) visitExternal(Position pos) visitFirstTime(Position pos) visitLastTime(Position pos) Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-20 Traversieren eines binären Baums void traverseNode(Position p){ if (tree.isExternal(p)) visitExternal(p) else{ visitFirstTime(p); traverseNode(tree.leftChild(p)); visitBetweenChildren(p); traverseNode(tree.rightChild(p)); visitLastTime(p); } Institut für Informatik Universität Basel Algorithmen und Datenstrukturen Lektion 5: Bäume 5-21