368 4 Algorithmen und Datenstrukturen



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

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

Binäre Bäume Darstellung und Traversierung

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

Kapiteltests zum Leitprogramm Binäre Suchbäume

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

Tutorium Algorithmen & Datenstrukturen

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

Datenstrukturen und Algorithmen

Datenstrukturen & Algorithmen

Programmierkurs Java

Algorithmen und Datenstrukturen Suchbaum

Algorithmen und Datenstrukturen

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

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

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.

Objektorientierte Programmierung

Grundlagen der Theoretischen Informatik, SoSe 2008

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

15 Optimales Kodieren

Professionelle Seminare im Bereich MS-Office

1 topologisches Sortieren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Konzepte der Informatik

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

WS 2009/10. Diskrete Strukturen

Was meinen die Leute eigentlich mit: Grexit?

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Leichte-Sprache-Bilder

13. Binäre Suchbäume

Anleitung Postfachsystem Inhalt

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

Repetitionsaufgaben Wurzelgleichungen

Programmiersprachen und Übersetzer

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 12.Übung bis

ARCO Software - Anleitung zur Umstellung der MWSt

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. ist einer davon.

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 )

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

Einführung in die Programmierung

Erstellen von x-y-diagrammen in OpenOffice.calc

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Binärdarstellung von Fliesskommazahlen

Java: Vererbung. Teil 3: super()

Kap. 4.2: Binäre Suchbäume

Inhaltsverzeichnis. 1. Empfängerübersicht / Empfänger hinzufügen 2. Erstellen eines neuen Newsletters / Mailings 3. Versand eines Newsletters

teamsync Kurzanleitung

Anwendungsbeispiele Buchhaltung

Grundbegriffe der Informatik

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Fallbeispiel: Eintragen einer Behandlung

Software Engineering Klassendiagramme Assoziationen

Erstellen einer digitalen Signatur für Adobe-Formulare

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

2.11 Kontextfreie Grammatiken und Parsebäume

Zählen von Objekten einer bestimmten Klasse

Diese Anleitung enthält Anweisungen, die nur durch erfahrene Anwender durchgeführt werden sollten!

ANLEITUNG - WIE UNTERSTÜTZE ICH AUF STARTNEXT?

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Objektorientierte Programmierung. Kapitel 12: Interfaces

Übungen Programmieren 1 Felix Rohrer. Übungen

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

Zeichen bei Zahlen entschlüsseln

Vertreterabrechnung DdD Cowis backoffice

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

Wichtig ist die Originalsatzung. Nur was in der Originalsatzung steht, gilt. Denn nur die Originalsatzung wurde vom Gericht geprüft.

EndTermTest PROGALGO WS1516 A

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

3. Verpackungskünstler. Berechnungen am Quader, Umgang mit Termen, räumliche Vorstellung

Beweisbar sichere Verschlüsselung

Benutzerhandbuch - Elterliche Kontrolle

Übungen für Woche 10

Anleitung: Einrichtung der Fritz!Box 7272 mit VoIP Telefonanschluss

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:

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

Inhalt. Inhalt Voraussetzungen Liegenschaften und Adressen auswählen Abgleich mit Internet-Office Dokumente...

1. Weniger Steuern zahlen

Unterrichtsmaterialien in digitaler und in gedruckter Form. Auszug aus:

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

Anleitung Typo3-Extension - Raumbuchungssystem

Second Steps in eport 2.0 So ordern Sie Credits und Berichte

Anleitung über den Umgang mit Schildern

Startseite, wenn Sie auf unseren Online-Shop gehen

Kurs 1613 Einführung in die imperative Programmierung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Animationen erstellen

Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.

2. Programmierung in C

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Überprüfung der digital signierten E-Rechnung

1. Loggen Sie sich mit Ihrem Benutzernamen in den Hosting-Manager (Confixx) auf Ihrer entsprechenden AREA ein.

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Sollsaldo und Habensaldo

7 Rechnen mit Polynomen

Transkript:

Kap04.fm Seite 368 Dienstag, 7. September 2010 1:51 13 368 4 Algorithmen und Datenstrukturen Java-Klassen Die ist die Klasse Object, ein Pfeil von Klasse A nach Klasse B bedeutet Bextends A, d.h. B ist Unterklasse von A. Listen sind Bäume bei denen jeder Knoten höchstens einen Nachfolger hat. Bäume stellt man gewöhnlich grafisch dar, indem jeder Knoten durch einen Punkt und jede Kante durch eine Strecke dargestellt wird. Dabei wird ein Vater immer über seinen Söhnen platziert, so dass die der höchste Punkt ist. In Anwendungsprogrammen hat sich auch eine Darstellung eingebürgert, in der die Sohnknoten jeweils in den Zeilen unter dem Vaterknoten und um einen festen Betrag eingerückt dargestellt werden. Die Knoten werden durch ein kleines Quadrat und ihren Namen dargestellt. Klickt man auf ein solches Quadrat, dann verschwindet der entsprechende Unterbaum er wird weggefaltet und in dem Quadrat erscheint ein +. Klickt man es erneut an, so wird der Unterbaum wieder entfaltet und das + durch ein - ersetzt. Diese Darstellung findet man in vielen Datei-Browsern, siehe Abbildung 1.31. 4.8.2 Binärbäume Im Allgemeinen können Baumknoten mehrere Söhne haben. Ein Binärbaum ist dadurch charakterisiert, dass jeder Knoten genau zwei Söhne besitzt. Einerekursive Definitionist: Ein Binärbaum ist leer, oder besteht aus einem Knoten () mit linkem und rechtem Sohn, die jeweils Binärbäume sind. w linker Teilbaum rechter Teilbaum Abb. 4.41: Binärbaum Binärbäume kann man als 2-dimensionale Verallgemeinerung von Listen ansehen, denn jede Liste kann als spezieller Binärbaum repräsentiert werden, in dem z.b. jeweils der linke Sohn eines Knotens leer ist. Ähnlich wie in den Zellen einer Liste kann man in den Knoten eines Binärbaumes beliebige Informationen speichern. Im Unterschied zu den Listenzellen enthält jeder Knoten zwei Verweise, einen zum linken und einen zum rechten Unterbaum.

Kap04.fm Seite 369 Dienstag, 7. September 2010 1:51 13 4.8 Bäume 369 Die Definition von Binärbäumen kann man durch Einführen spezieller Blattknoten variieren: Ein Binärbaum mit Blättern ist leer oder besteht aus einem Blatt, oder einem Knoten () mit linkem undrechtem Sohn, die jeweils Binärbäume sind. Eine wichtige Anwendung von Bäumen, insbesondere auch von Binärbäumen, ist die Repräsentation arithmetischer Ausdrücke. Innere Knoten enthalten Operatoren, Blätter enthalten Werte oder Variablennamen. Einstellige Operatoren werden als Knoten mit nur einem nichtleeren Teilbaum repräsentiert. In der Baumdarstellung sind Klammern und Präzedenzregeln überflüssig. Erst wenn wir einen zweidimensionalen Baum eindimensional (als String) darstellen wollen, sind Klammern notwendig. Beachte, dass das Vorzeichen - und das Quadrieren einstellige Operatoren sind. Im Baum stellen wir sie durch +/- bzw. durch () 2 dar. +/- (-12) -(3 * (7-5) 2-9) 12 * 3 ( )2 9 7 5 Abb. 4.42: Binärbaum zur Repräsentationeines arithmetischen Ausdruckes 4.8.3 Implementierung von Binärbäumen Da Binärbäume zweidimensionale Verallgemeinerungen von Listen sind, lassen wir uns bei der Implementierung von Binärbäumen auch von der Implementierung verketteter Listen leiten. Statt Zelle sagt man hier Knoten und statt einem Zeiger next auf den Rest der Liste hat man hier zwei Zeiger und auf die entsprechenden Teilbäume. Wir entscheiden uns für eine generische Implementierung. class Knoten<E>{ E ; Knoten<E>,; Knoten(E el, Knoten<E> li, Knoten<E> re){ = el; = li; = re;

Kap04.fm Seite 370 Dienstag, 7. September 2010 1:51 13 370 4 Algorithmen und Datenstrukturen Abb. 4.43: Jeder Knoten ist eines Baumes Ein Baum mit n Knoten hat (n 1) Kanten denn jede Kante verbindet einen Sohn mit seinemvater. Bei einer Pointer-Darstellung eines Baumes mit n Knoten gibt es daher 2 n (n 1) =n+1pointer, die den Wert null haben. Ein Binärbaum ist nichts anderes als ein ausgewählter Knoten, genannt, ggf. zusammen mit weiteren Feldern und Methoden. Wir sehen die Implementierung von Iteratoren vor: class BinärBaum <E> implements Iterable<E>{ private Knoten<E> wurzel; boolean istleer(){ return wurzel == null;... Es ist recht einfach, aus zwei Bäumen b 1 und b 2 und einem Knoten k einen neuen Baum mit k als und b 1 als linkem, b 2 als rechtem Teilbaum zu bauen, dies erledigt der Konstruktor wurzel = k; wurzel. = b1; wurzel. = b2; Bisher haben wir aber noch keine Vorstellung davon, was es heißen könnte, ein Element an einer inneren Position in einem Binärbaum einzufügen. Was soll mit den bisherigen Elementen geschehen? Meist sind sie nach irgendeinem Ordnungsprinzip in den Baum eingeordnet, und dies wollen wir erhalten. Das analoge Problem haben wir auch bei dem Löschen eines Knotens. Wie sollen die anderen Knoten aufrücken? In einer Liste hat jedes Element eine Position. Bei Bäumen entspricht dem sinnvollerweise eine so genannte Baumadresse. Sie gibt an, wie der betreffende Knoten von der ausgehend zu erreichen ist. Die Adresse... beschreibt z.b. in der obigen Abbildung 4.42 den Weg zu dem Blatt mit Inhalt 7. Natürlich kann man solche Adressen auch binär codieren, hier z.b. durch 10100.

Kap04.fm Seite 371 Dienstag, 7. September 2010 1:51 13 4.8 Bäume 371 4.8.4 Traversierungen Listen konnten wir auf natürliche Weise von vorne nach hinten durchlaufen bei Bäumen können wir ähnlich einfach von der zu jedem beliebigen Blatt gelangen, sofern wir seine Baumadresse kennen. Um den Vorgänger eines Elementes e in einer Liste zu finden, mussten wir am Anfang einsteigen und nach hinten laufen, bis wir zu einer Zelle z gelangten mit z.next=e. Um in einem Baum den Vater einesknotens zu finden, haben wir es schwerer wir müssen an der einsteigen und uns in jedem Schritt entscheiden, ob wir nach oder nach gehen sollen. Spätestens hier erhebt sich die Frage, wie wir systematisch alle Knoten eines Baumes durchlaufen vornehmer: traversieren können. Für Listen gab es nur eine sinnvolle Traversierung vom Anfang zum Ende und wir haben einen entsprechenden Iterator in der Liste definiert (S. 358). Die Baumklassen wurde oben ebenfalls generisch definiert und wir werden auch die Traversierung von Bäumen mit Hilfe von Iteratoren implementieren. Für die Reihenfolge eines Baumdurchlaufs gibt es mehrere naheliegende Möglichkeiten, von denen wir die wichtigsten, Preorder, Postorder, Inorder und Levelorder, besprechen wollen. Analog zu dem Listeniterator werden wir entsprechende Iteratoren PreOrder, PostOrder, Inorder und LevelOrder definieren. Wir zeigen jedes Mal das Ergebnis am Beispiel des Baumes aus Abbildung 4.42. Beim Besuch eines Knotens wollenwir diesen ausgeben. Wir testen also unsere Iteratoren mit einer passenden tostring Methode, die mit Hilfe des Iterators alle Knoten des Baumes besucht und ausgibt: public String tostring(){ String s = ""; for (E e : this) s += e+" "; return s; DieerstendreiTraversierungensind rekursivbeschrieben diesliegt aufgrundderinduktiven Definition nahe undlassen sich daher besonders einfach implementieren. Preorder: Besuche die. Traversiere den linken Teilbaum in Preorder. Traversiere den rechten Teilbaum in Preorder. - +/- 12 * 3 ( ) 2-7 5 9 in Preorder in Preorder Abb. 4.44: Preorder Traversierung des Baumes aus Abbildung 4.42 Inorder und Postorder vertauschen gegenüber Preorder die Reihenfolge der Anweisungen.

Kap04.fm Seite 372 Dienstag, 7. September 2010 1:51 13 372 4 Algorithmen und Datenstrukturen Inorder: Traversiere den linken Teilbaum in Inorder. Besuche die. Traversiere den rechten Teilbaum in Inorder. 12 +/- 3 * 7 5 ( ) 2 9 in Inorder in Inorder Abb. 4.45: Inorder-Traversierung des Baumes aus Abbildung 4.42 Postorder: Traversiere den linken Teilbaum in Postorder. Traversiere den rechten Teilbaum in Postorder. Besuche die. 12 +/- 3 7 5 ( ) 2 * 9 in Postorder in Postorder Abb. 4.46: Postorder Traversierung des Baumes aus Abbildung 4.42 Postorder ist die wichtigste der diskutierten Traversierungen. Die Postorder Traversierung liefert nämlich genau die Postfix-Notation (siehe S. 347) des arithmetischen Ausdrucks, welcher durch einen Binärbaum repräsentiert wird. Die Umwandlung eines als Zeichenkette repräsentierten Ausdruckes wie z.b. ( -12 ) - ( 3 * ( 7-5 ) 2-9 ) in einen Baum, und die anschließende Postorder Traversierung zur Generierung von Code für eine Stackmaschine, ist eine der Kernaufgaben jedescompilers. Für die oben definierte Klasse Baum können wir sofort statische Methoden angeben, die die bisher diskutierten Traversierungen rekursiv durchführen. Für Preorder erhalten wir: void preorder(){ rekpreorder(wurzel); void rekpreorder(knoten<e> k){ if (k!= null){ tuwas(k.); rekpreorder(k.); rekpreorder(k.);