Bäume, Anwendung und Begriffe

Ähnliche Dokumente
Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Vorlesung Datenstrukturen

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

13. Binäre Suchbäume

368 4 Algorithmen und Datenstrukturen

Binärbäume. Prof. Dr. E. Ehses,

Algorithmen und Datenstrukturen Suchbaum

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Algorithmen und Datenstrukturen 1

Binäre Bäume Darstellung und Traversierung

Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

2 Java: Bäume. 2.1 Implementierung von Bäumen. 2.2 Implementierung eines binären Suchbaums. 2.3 Traversierung von Bäumen

6 Baumstrukturen. Formale Grundlagen der Informatik I Herbstsemester Robert Marti

Einführung in (Binäre) Bäume

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Informatik II, SS 2014

Tutorium Algorithmen & Datenstrukturen

Geordnete Binärbäume

Kap. 4.2: Binäre Suchbäume

Algorithmen und Datenstrukturen SS09

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Kapiteltests zum Leitprogramm Binäre Suchbäume

Informatik II, SS 2014

In diesem Kapitel behandeln wir erste Algorithmen mit dynamischen Strukturen, wie Bäume und Graphen. 1. Bäume Grundlagen...

Suchen und Sortieren

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany Stammbaum. Stammbaum. Stammbaum

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Datenstrukturen und Algorithmen

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Informatik II. PVK Part1 Severin Wischmann n.ethz.ch/~wiseveri

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

10. Kapitel (Teil1) BÄUME GRUNDLAGEN. Algorithmen & Datenstrukturen Prof. Dr. Wolfgang Schramm

Abstrakte Datentypen.

Rekurrenzen T(n) = T(n 1) + N beschreibt Laufzeitverhalten eines rekursiven Algorithmus

Suchbäume mit inneren Knoten verschiedener Knotengrade.

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Programmiertechnik II

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Proseminar Kodierverfahren bei Dr. Ulrich Tamm Sommersemester 2003 Thema: Codierung von Bäumen (Prüfer Codes...)

2 i. i=0. und beweisen Sie mittels eines geeigneten Verfahrens die Korrektheit der geschlossenen Form.

11.1 Grundlagen - Denitionen

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

14. Rot-Schwarz-Bäume

Suchen und Sortieren Sortieren. Heaps

Grundlagen der Programmierung

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Klausur Informatik B April Teil I: Informatik 3

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Algorithmen & Datenstrukturen 1. Klausur

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Übung zur Vorlesung Algorithmische Geometrie

Bäume, Suchbäume und Hash-Tabellen

Datenstrukturen & Algorithmen

Beispielblatt VU Algorithmen und Datenstrukturen 1 VU 6.0

Kapitel : Andere dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Bäume Jiri Spale, Algorithmen und Datenstrukturen - Bäume 1

Klausur zur Veranstaltung Programmierung (fortgeschrittene Konzepte)

Programmiertechnik II

Binäre Suchbäume. Ein Leitprogramm von Timur Erdag und Björn Steffen

9.4 Binäre Suchbäume. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

Kapitel 9 Suchalgorithmen

Ein Graph ist ein Paar (V,E), wobei V eine Menge von Knoten und E eine Menge von Kanten (v,w) mit v,w in V ist.

Objektorientierte Programmierung

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

Algorithmen und Datenstrukturen Balancierte Suchbäume

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

EndTermTest PROGALGO WS1516 A

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Inhalte Informatik. I1 Grundprinzip des objektorientierten Modellierens I3 Modellieren von Netzwerkanwendungen

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Präfx Trie zur Stringverarbeitung. Cheng Ying Sabine Laubichler Vasker Pokhrel

Schnittstellen implementieren am Beispiel Suchbaum

Übungen zu Programmierung I - Blatt 8

Algorithmen und Datenstrukturen Kapitel 7 Dynamische Mengen, das Suchproblem &

Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Vorlesung : Binäre Entscheidungsdiagramme (BDDs) Dr. Carsten Sinz

Advanced Programming in C

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Fortgeschrittene Programmiertechnik Klausur WS 2014/15 Angewandte Informatik Bachelor

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

6 Speicherorganisation

6.4 Traversierung von Bäumen

Abschnitt 18: Effizientes Suchen in Mengen

Tutoren Simon Andermatt Lukas Beck. Alexis Peter Thomas Ritter

Kapitel : Andere dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2013/14. Prof. Dr. Sándor Fekete

Transkript:

Bäume Sie wissen, was Bäume in der Informatik sind Sie kennen das Besucher-Entwurfsmuster Sie kennen Binärbäume Sie können die Bäume auf unterschiedliche Arten traversieren Sie wissen, wie man in Binärbäumen Elemente löscht

Bäume, Anwendung und Begriffe 2 von 41

Beispiel 1: Dateisystem Wurzel: Wurzel: der der Ursprung Ursprung des des Baumes Baumes root Windows Programme Eigene Dateien innerer innerer Knoten: Knoten: Knoten Knoten mit mit Nachfolger Nachfolger Kante: Kante: gerichtete gerichtete Verbindung Verbindung zwischen zwischen Knoten Knoten System Font SendTo Sun.. Java.exe Javac.exe Blätter: Knoten ohne Blätter: Knoten ohne Nachfolger Nachfolger 3 von 41

Beispiel 2: XML- Dokument Ein XML Dokument besteht aus einem Wurzelelement an dem beliebig viele Nachfolgeelemente angehängt sind, an denen wiederum Nachfolgeelemente hängen können. <adresse> <anrede>herr</anrede> <vorname>peter<vorname> <nachname>werner</nachname> <strasse>in der Weid 17</strasse> <plz>9410</plz> <ort>heiden</ort> </adresse > adresse adresse vornamen vornamen nachnamen nachnamen strasse strasse plz plz ort ort Peter Peter Werner Werner 9410 9410 Heiden Heiden In In der der Weid Weid 17 17 4 von 41

Beispiel 3: Ausdruck-Baum Der Ausdruck-Baum (expression tree) wird eingesetzt um arithmetische Ausdrücke auszuwerten: der Ausdruck wird zuerst in einen Baum umgeformt und dann ausgewertet. a + b * c + innerer innerer Knoten: Knoten: Operationen Operationen a * b c Blätter: Blätter: Operanden Operanden 5 von 41

Definition Baum (rekursiv) Der Baum ist eine fundamentale Datenstruktur in der Informatik ein ein Baum Baum ist ist leer leer oder oder er er besteht besteht aus aus einem einem Knoten Knoten mit mit keinem, einem einem oder oder mehreren Teilbäumen T1 T1,, T2 T2,,...... Tk Tk.. Baum Baum = leer leer Baum Baum = Knoten Knoten (Baum)* root T1 T2 T3 T4 6 von 41

Definition Baum (nicht rekursiv) Ein Baum T=(V,E) besteht aus eine Menge von Knoten V und einer Menge von gerichteten Kanten E. Der root-knoten r V hat nur Ausgangskanten. Alle anderen Knoten n V\r haben genau eine Eingangskante, wobei für alle Kanten gilt: e= (v1,v2 ) und v1!= v2. Hinweis: Knoten werden auch vertices bzw. vertex genannt. Kanten heissen auch edges bzw. edge. 7 von 41

Eigenschaften und Begriffe Alle Knoten ausser Wurzel (root) sind Nachfolger (descendant, child) genau eines Vorgänger-Knotens (ancestor, parent). Knoten mit Nachfolger werden innerer Knoten bezeichnet Knoten ohne Nachfolger sind Blattknoten. Knoten mit dem gleichen Vorgänger-Knoten sind Geschwisterknoten (sibling). Es gibt genau einen Pfad vom Wurzel-Knoten zu jedem anderen Knoten. Die Anzahl der Kanten, denen wir folgen müssen, ist die Weglänge (path length). Die Tiefe (oder Höhe) eines Baumes gibt an, wie weit die "tiefsten" Blätter von der Wurzel entfernt sind: Anzahl Kanten + 1. Die Gewicht ist die Anzahl der Knoten des (Teil-)Baumes 8 von 41

Übung root-node =... Tiefe =. Gewicht =. Nachfolger von B =... Nachfolger von A =... Vorgänger von K =... Blattknoten =... Geschwister von C =... Geschwister von H =... Ein Knoten hat... Vorgänger-Knoten. Ein Knoten kann... Kinder haben. 9 von 41

Knoten Implementation public public class class TreeNode<T> TreeNode<T> T T element; element; List<TreeNode<T>> List<TreeNode<T>> edges; edges; TreeNode(T TreeNode(T theelement) theelement) element element = = theelement; theelement; Jeder Knoten hat Zeiger auf jeden Nachfolger in Array gespeichert Die Zahl der Nachfolger pro Knoten kann stark variieren und ist meist nicht zum voraus bekannt -> nicht effizient. mögliche bessere Lösung: Zeiger in Liste verwalten. 10 von 41

Binärbaum 11 von 41

Der Binärbaum Die am häufigsten verwendete Art von Bäumen: beim Binärbaum hat ein Knoten maximal 2 Nachfolger. Definition (rekursiv): Ein Binärbaum ist entweder leer, oder besteht aus einem Wurzel-Knoten und aus einem linken und einem rechten Teilbaum. Baum Baum = leer leer Baum Baum = Knoten Knoten (Baum (Baum Baum) Baum) 12 von 41

Die Datenstruktur des Binärbaums public public class class TreeNode<T> TreeNode<T> T T element; element; TreeNode<T> TreeNode<T> left; left; TreeNode<T> TreeNode<T> right; right; TreeNode(T TreeNode(T theelement) theelement) element element = = theelement; theelement; 13 von 41

Eigenschaften Tiefe/Höhe: k auf jedem Niveau 2 n Knoten oder 2 (k-1) Niveau 0/Tiefe 1 Niveau 1/Tiefe 2 Maximal Anzahl 2 k - 1 Knoten Niveau 2/.. Ein Binärbaum heisst voll (oder vollständig), wenn ausser der letzten alle seinen Ebenen vollständig besetzt sind. Aufgabe: Leiten Sie eine Formel für die Höhe des vollen Baumes her und bestimmen Sie die Tiefe eines vollen Binärbaums mit 37 Knoten? Hinweis log a n = ln n / ln a 14 von 41

Traversierungen 15 von 41

Ausgeben aller Elemente Baum = leer Baum = Element (Baum Baum) public public class class TreeNode<T> TreeNode<T> T element; element; TreeNode<T> TreeNode<T> left; left; TreeNode<T> TreeNode<T> right; right; Übung: Schreiben Sie eine rekursive Methode printtree, die alle Elemente eines Baumes ausgibt Hinweis: Ausgeben einer Liste mit einer rekursiven Methode: void printlist(listnode node) if (node!= null) System.out.println(node.element); printlist(node.next) 16 von 41

Traversieren Das (rekursive) Besuchen aller Knoten in einem Baum wird als durchlaufen oder traversieren bezeichnet. Die Art der Traversierung bestimmt die Reihenfolge, in welcher die Knoten besucht werden. Dadurch sind die Knoten linear geordnet Die möglichen Arten von Traversierung (beim Binärbaum) sind: Preorder Knoten zuerst: n, A, B n Inorder Knoten in der Mitte: A, n, B Postorder Knoten am Schluss: A, B, n Levelorder: n, a 0, b 0, a 1, a 2, b 1, b 2,.. A B 17 von 41

Klassen zur rekursiven Traversierung Rückruf Prinzip & Besucher Entwurfsmuster: die visit Methode des übergebenen Visitors wird für jeden Knoten aufgerufen class TreeNode<T> interface Tree<T> interface Traversal<T> preorder(visitor<t> v)... interface Visitor<T> visit(t o); class BinaryTree<T> Traversal traversal class TreeTraversal<T> preorder(visitor<t>r v)... class MyVisitor visit(c o). 18 von 41

Klassen zur Traversierung eines Baumes interface interface Tree<T> Tree<T> Traversal<T> Traversal<T> traversal(); traversal(); void void add(t add(t o); o); void void remove(t remove(t o); o); Schnittstelle mit den grundlegenden Operationen class class TreeNode<T> TreeNode<T> T T element; element; TreeNode<T> TreeNode<T> left,right; left,right; Knotenelement interface interface Traversal<T> Traversal<T> void void preorder(visitor<t> preorder(visitor<t> vistor); vistor); void void inorder(visitor<t> inorder(visitor<t> visitor); visitor); void void postorder(visitor<t> postorder(visitor<t> visitor); visitor); Interface mit traversal Methode(n) interface interface Visitor<T> Visitor<T> void void visit(t visit(t o) o) Interface des "Besuchers" class class MyCVisitor MyCVisitor implements implements Visitor<T> Visitor<T> visit(t visit(t o) o) System.out.println(c); System.out.println(c); Implementation des "Besuchers" 19 von 41

Implementation Preorder Verarbeitung am Anfang Besuche Besuche die die Wurzel. Wurzel. Traversiere Traversiere den den linken linken Teilbaum Teilbaum (in (in Preorder). Preorder). Traversiere Traversiere den den rechten rechten Teilbaum Teilbaum (in (in Preorder). Preorder). interface Visitor<T> void visit(t obj); class MyCVisitor implements Visitor<T> public void visit (T obj) System.out.println(obj); class TreeTraversal<T> implements Traversal<T> TreeNode<T> root; private void preorder(treenode<t> node, Visitor<T> visitor) if (node!= null) visitor.visit(node.element); preorder(node.left,visitor); preorder(node.right,visitor); public void preorder(visitor<t> visitor) preorder(root,visitor) call-back call-back (Hollywood) (Hollywood) Prinzip Prinzip 20 von 41

Implementation Postorder Verarbeitung am Schluss Traversiere Traversiere den den linken linken Teilbaum Teilbaum (in (in Postorder). Postorder). Traversiere Traversiere den den rechten rechten Teilbaum Teilbaum (in (in Postorder). Postorder). Besuche Besuche die die Wurzel. Wurzel. private void postorder(treenode<t> node, Visitor<T> visitor) if (node!= null) postorder(node.left,visitor); postorder(node.right,visitor); visitor.visit(node.element); Zuerst werden die Nachfolger abgearbeitet und dann der Knoten selber (von unten nach oben) left und right werden nicht mehr traversiert, kann z.b. verwendet werden, wenn der Baum umgespeichert werden muss 21 von 41

Implementation Inorder Verarbeitung in der Mitte Traversiere Traversiere den den linken linken Teilbaum Teilbaum (in (in Inorder). Inorder). Besuche Besuche die die Wurzel. Wurzel. Traversiere Traversiere den den rechten rechten Teilbaum Teilbaum (in (in Inorder). Inorder). private void inorder(treenode<t> node, Visitor<T> visitor) if (node!= null) inorder(node.left,visitor); visitor.visit(node.element); inorder(node.right,visitor); Der Baum wird quasi von links nach rechts abgearbeitet 22 von 41

Implementation Preorder mit explizitem Stack Es wird nicht der Aufrufstack verwendet Kindelemente werden auf den Stack abgelegt und im nächsten Durchgang verarbeitet void preorder(treenode<t> node, Visitor<T> visitor) Stack s = new Stack(); if (node!= null) s.push(node); while (!s.isempty()) node = s.pop(); visitor.visit(node.element); if (node.right!= null) s.push(node.right); if (node.left!=null) s.push(node.left); 23 von 41

Implementation Levelorder Besuche die Knoten schichtenweise: zuerst die Wurzel, dann die Wurzel des linken und rechten Teilbaumes, dann die nächste Schicht, usw.... void levelorder(treenode<t> node, Visitor<T> visitor) Queue q = new Queue(); if (node!= null) q.enqueue(node); while (!q.isempty()) node = q.dequeue(); visitor.visit(node.element); if (node.left!=null) q.enqueue(node.left); if (node.right!= null) q.enqueue(node.right); 24 von 41

Aufgerufene Methode (Lambda Ausdruck) Methode ist in einer Klasse die das Interface imlementiert Traversal preorder(visitor visitor);... class MyCVisitor implements Visitor<T> public void visit (T obj) System.out.println(obj); traversal.preorder(new MyCVisitor()); Kann auch als Annonyme Klasse "inline" implementiert werden traversal.preorder(new Visitor() public void visit (T obj) System.out.println(obj); ); Noch eleganter als Java 8 Lambda Ausdruck traversal.preorder(obj -> System.out.println(obj);) 25 von 41

Übung Zeigen Sie die Reihenfolge bei den verschiedenen Traversierungsarten h auf d i b f a c e g Preorder: (n, L, R). Inorder: (L, n, R)... Postorder: (L, R, n).. Levelorder:.. 26 von 41

Übung Preorder-Traversierung: 10, 3, 1, 4, 2, 9, 7, 5, 8 Inorder-Traversierung: 3, 4, 1, 10, 9, 7, 2, 8, 5 Zeichnen und stellen Sie den Baum anhand dieser Informationen wieder her. 10 10 3 3 2 2 1 1 9 9 5 5 4 4 7 7 8 8 27 von 41

Mutationen von (sortieren) Bäumen 28 von 41

Übung Anfügen an Liste Zum Einfügen stellt man sich Bäume am einfachsten als erweiterte Listen vor first A... Z null Übung: Schreiben Sie eine rekursive Methode insertat, die ein neues Element am Schluss einer Liste anhängt.... root A 29 von 41

Einfügen unsortiert a) freie Stelle finden b) neuen Knoten einfügen class BinaryTree<T> implements Tree<T> private TreeNode<T> root; private TreeNode insertat(treenode node, T x) if (node == null) return new TreeNode(x); else node.right = insertat(node.right, x); // or // node.left = insertat(node.left, x); return node; links links oder oder rechts rechts einfügen einfügen public void insert (T x) root = insertat(root, x); 30 von 41

Sortierte Binärbäume Beim binären Suchbaum werden die Objekte anhand ihres (Schlüssel-) Werts geordnet eingefügt: in Java: Interface Comparable<T> Definition: Für jeden Knoten gilt im linken Unterbaum sind alle kleineren Elemente K L <=* k im rechten Unterbaum sind alle grösseren Elemente: K R >* k <= k > * manchmal auch < und >= K L K R 31 von 41

Beispiel eines sortierten Binärbaums Der sortierte Binärbaum hat nach dem Einfügen von "BAUMBEISPIEL" folgende Gestalt B A U B M E S E I P I L 32 von 41

Übung Numerieren Sie die Knoten entsprechend ihrer Reihenfolge beim Einfügen Geben Sie an, welche Zeichenkette bei einer Inorder Traversierung ausgegeben wird Welche Traversierung muss angewendet werden, damit die Knoten in alphabetischer Reihenfolge ausgegeben werden? Zeichnen Sie den Baum auf, bei dem man die Zeichenkette rückwärts eingefügt hat, d.h. L,E,I, Zeichnen sie den Baum auf, der beim Einfügen von A,B,B,E,E,I,I,L,M,P,S,U entsteht 33 von 41

Einfügen sortiert Beim Einfügen muss links eingefügt werden, wenn das neue Element kleiner oder gleich ist, sonst rechts class class BinaryTree<T BinaryTree<T extends extends Comparable<T>> Comparable<T>> implements implements Tree<T> Tree<T> private private TreeNode<T> TreeNode<T> root; root; private private TreeNode<T> TreeNode<T> insertat(treenode<t> insertat(treenode<t> node, node, T T x) x) if if (node (node == == null) null) return return new new TreeNode(x); TreeNode(x); else else if if (x.compareto(element) (x.compareto(element) <= <= 0) 0) node.left node.left = = insertat(node.left, insertat(node.left, x); x); else else node.right node.right = = insertat(node.right, insertat(node.right, x); x); return return node; node; public public void void add add (T (T x) x) root root = = insertat(root, insertat(root, x); x); 34 von 41

Löschen: einfache Fälle a) den zu entfernenden Knoten suchen b) Knoten löschen. Dabei gibt es 3 Fälle: 1) der Knoten hat keinen Teilbaum Knoten löschen 2) der Knoten hat einen Teilbaum 3) der Knoten hat zwei Teilbäume (später) 35 von 41

Löschen: komplizierter Fall a) den zu entfernenden Knoten suchen b) Knoten löschen. Dabei gibt es 3 Fälle: 1) der Knoten hat keinen Teilbaum Knoten löschen 2) der Knoten hat einen Teilbaum 3) der Knoten hat zwei Teilbäume Fall 3: Es muss ein Ersatzknoten mit Schlüssel k gefunden werden, so dass gilt: K L <= k und K R > k Lösung: der Knoten, der im linken Teilbaum ganz rechts liegt. K L K R Frage: Frage: wieso wieso dürfen dürfen wir wir diesen diesen Knoten Knoten entfernen? entfernen? 36 von 41

Löschen Beispiel Es soll M gelöscht werden. vom linken Teilbaum wir das Element ganz rechts als Ersatz genommen, i.e. L. A B U L kann einfach aus seiner ursprünglichen Position herausgelöst werden, da es maximal einen Nachfolger hat. E B M S E I P I L 37 von 41

Finden von Ersatzknoten // find node to replace TreeNode<T> rep; private TreeNode<T> findrepat(treenode<t> node) if (node.right!= null) node.right = findrepat(node.right); return node; else rep = node; return node.left; dadurch dadurch wird wird Knoten Knoten aus aus Baum Baum entfernt entfernt K L K R 38 von 41

Löschen Code // remove node private TreeNode<T> removeat(treenode<t> node, T x) if (node == null) return null; else if (x.compareto(node.element) == 0) // found removed = node.element; if (node.left == null) return node.right; else if (node.right == null) return node.left; else node.left = findrepat(node.left); rep.left = node.left; rep.right = node.right; return rep; else if (x.compareto(node.element) <= 0) // search left node.left = removeat(node.left, x); else // search right node.right = removeat(node.right, x); return node; // find node to replace TreeNode<T> rep; private TreeNode<T> findrepat(treenode<t> node) if (node.right!= null) node.right = findrepat(node.right); return node; else rep = node; return node.left; 39 von 41

Suchen (Ausblick) Suche Suche x im im Baum Baum B: B: Wenn Wenn x x == == Wurzelelement Wurzelelement gilt, gilt, haben haben wir wir x x gefunden. gefunden. Wenn Wenn x x > > Wurzelelement Wurzelelement gilt, gilt, wird wird die die Suche Suche im im rechten rechten Teilbaum Teilbaum von von B fortgesetzt, fortgesetzt, sonst sonst im im linken linken Teilbaum. Teilbaum. public Object search(treenode<t> node, T x) if (node == null) return node; else if (x.compareto(node.element) == 0) return node; else if (x.compareto(node.element) <= 0) return search(node.left,x); else return search(node.left,x); Bei einem vollen Binärbaum müssen lediglich Log 2 Schritte durchgeführt werden bis Element gefunden wird. Binäres Suchen sehr effizient Bsp: 1000 Elemente -> 10 Schritte 40 von 41

Zusammenfassung Allgemeine Bäume rekursive Definition Knoten (Vertex) und Kanten (Edge) Eigenschaften von Bäumen Binärbäume: Bäume mit maximal zwei Nachfolgern Traversal, Visitor verschiedene Traversierungsarten Inorder, Preorder, Postorder, Levelorder sortierte Binärbäume Einführung Einfügen Löschen Suchen 41 von 41