Grundlagen der Informatik / Algorithmen und Datenstrukturen. Aufgabe 139

Ähnliche Dokumente
Grundlagen der Informatik / Algorithmen und Datenstrukturen. Aufgabe 132

Tutoraufgabe 1 (Implementierung eines ADTs):

Grundlagen der Informatik / Algorithmen und Datenstrukturen. Aufgabe 143

4.4.1 Implementierung vollständiger Bäume mit Feldern. Reguläre Struktur: Nachfolger des Knoten i sind die Knoten 2*i und 2*i+1.

Algorithmen und Datenstrukturen

Kapitel 12: Induktive

Probeklausur zur Vorlesung

Einstieg in die Informatik mit Java

Tutoraufgabe 1 (Implementierung eines ADTs):

Software Entwicklung 1

Beispielprüfung CuP WS 2015/2016

Beispiellösung zur Klausur AI2 im Sommersemester 2007

Einstieg in die Informatik mit Java

16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Einführung in die Informatik 2

Informatik II Übung 7. Pascal Schärli

Algorithmen und Programmierung III

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

1 Klassen anlegen und Objekte erzeugen

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Einführung in die Informatik 2

1 Klassen anlegen und Objekte erzeugen

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

Allgemeine Hinweise:

Felder. Inhaltsverzeichnis. M. Jakob. 28. April Begriffsbildung. Verwendung von Feldern. Gymnasium Pegnitz

Tag 8 Repetitorium Informatik (Java)

Informatik II - Tutorium 2

Felder. M. Jakob. 28. April Gymnasium Pegnitz

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Name: Matrikelnr : Aufgabe 1: (ca. 8 Punkte )

Institut für Programmierung und Reaktive Systeme 7. Juli Programmieren II. Übungsklausur

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

Klausur Software-Entwicklung September 00

Programmierung für Mathematik HS11

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Institut für Programmierung und Reaktive Systeme 6. Juli Programmieren II. Übungsklausur

Fakultät IV Elektrotechnik/Informatik

II.4.1 Unterklassen und Vererbung - 1 -

19. Vererbung und Polymorphie

Musterlösung Stand: 5. Februar 2009

System.out.println("TEXT");

Datenstrukturen & Algorithmen Lösungen zu Blatt 8 FS 16

Vorkurs Informatik WiSe 15/16

Objektorientierte Programmierung

Software Entwicklung 1

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Propädeutikum Programmierung in der Bioinformatik

Software Entwicklung 1

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 16. Juli Klausur

Überblick. Rekursive Methoden. Backtracking. Memorization. Einfache rekursive Datenstrukturen. Aufzählen, Untermengen, Permutationen, Bitmengen

Allgemeine Hinweise:

Geoinformatik und Vermessung Prüfung 502 : Informatik (JAVA)

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

Übung 4: Die generische Klasse AvlBaum in Java 1

Übungslösungen. 1. Übung

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

13. Bäume: effektives Suchen und Sortieren

12 Abstrakte Klassen, finale Klassen und Interfaces

Technische Universität Braunschweig

Übungen zum Bioinformatik-Tutorium. Blatt 6

Programmiermethodik 3. Klausur Lösung

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

13. Bäume: effektives Suchen und Sortieren

Tutoraufgabe 1 (2 3 4 Bäume):

7. Dynamische Datenstrukturen Bäume. Informatik II für Verkehrsingenieure

Informatik II - Übung 07

Interface. So werden Interfaces gemacht

Programmieren in Java -Eingangstest-

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Einführung in die Programmierung und Programmiersprachen (OOP)

II.4.1 Unterklassen und Vererbung - 1 -

3. Die Datenstruktur Graph

Informatik II Übung 2. Pascal Schärli

II.4.1 Unterklassen und Vererbung - 1 -

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Bäume. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

Allgemeine Hinweise:

Tutoraufgabe 1 (Implementierung eines ADTs):

18. Vererbung und Polymorphie

Klausur Fachprüfung Wirtschaftsinformatik. Name:

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 17/18. Kapitel 14. Bäume. Bäume 1

Binärbäume: Beispiel

Objektorientierte Programmierung Studiengang Medieninformatik

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

pue08 December 9, 2016

Java-Implementierung der Priority-Queue und des Huffman-Algorithmus Effiziente Algorithmen SS12 Übung 4 Aufgabe 5 Johannes Hein

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Wintersemester 2004/ Januar Aus der Vorlesung sind Datenstrukturen zur Repräsentation von Wäldern disjunkter Mengen bekannt.

Lösungshinweise/-vorschläge zum Übungsblatt 8: Software-Entwicklung 1 (WS 2017/18)

Bäume. Martin Wirsing. Ziele. Baumknoten. Bäume - 2-dimensionale Listen. Standardimplementierungen für Bäume kennenlernen

Folienpaket 7 Themenschwerpunkte: Methoden in OOP /2016 Dr. Daniel Haase - Vorkurse Informatik V3/V4

Instrumentierung und Dekodierung

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Übung Algorithmen und Datenstrukturen

Transkript:

Aufgabe 139

Aufgabe 139 Aufgabenstellung Stellen Sie den folgenden in Feldbaum-Darstellung beschriebenen Binärbaum a) graphisch (welcher Knoten ist die Wurzel?), b) in halbsequentieller Darstellung, c) in sequentieller Darstellung, d) als Adjazenzmatrix (die Kanten seien so gerichtet, dass sie jeweils vom Vater auf die Söhne zeigen) dar.

Aufgabe 139 zu Aufgabe 139a Schritt 1: Beginne bei den Knoten, die keine Kinder haben

Aufgabe 139 zu Aufgabe 139a Schritt 2:

Aufgabe 139 zu Aufgabe 139a Schritt 3:

Aufgabe 139 zu Aufgabe 139b - Vorgehensweise: siehe Folien M 41 bis M 44 den Baum in Vorordnung durchgehen und der Reihe nach in key eintragen bei allen Blättern: rightchild = -1, isleaf = true den Rest ablesen

Aufgabe 139 zu Aufgabe 139b - halbsequentielle Darstellung: key rightchild isleaf 0 d 7 false 1 b 3 false 2 i -1 true 3 k 6 false 4 c -1 false 5 n -1 true 6 m -1 true 7 j -1 false 8 g 12 false 9 e 11 false 10 l -1 true 11 a -1 true 12 h 13 false 13 f -1 true

Aufgabe 139 zu Aufgabe 139c - Vorgehensweise: siehe Folien M 45 bis M 50 den Baum stufenweise von links nach rechts durchgehen Für jeden Knoten mit Index i hat das linke Kind den Index 2i + 1, das rechte Kind den Index 2i + 2. Umgekehrt gilt: der zugehörige Elternknoten hat den Index (i 1) DIV 2

Aufgabe 139 zu Aufgabe 139c - sequentielle Darstellung: index key index key 0 d 16-1 b 17-2 j 18-3 i 19 n 4 k 20-5 g 21-6 - 22-7 - 23 l 8-24 a 9 c 25-10 m 26 f 11 e 12 h 13-14 - 15 -

Aufgabe 139 zu Aufgabe 139d Bei der Adjazenzmatrix wird für jeden Knoten (Zeile), der Kinder besitzt, die entsprechende Spalte mit einer 1 markiert. Die Nummerierung der Knoten ist prinzipiell beliebig. Entsprechende Werte lassen sich beispielsweise leicht aus der Feldbaum-Darstellung (Aufgabenstellung) ablesen. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 0 1 0 0 0 0 0 0 0 1 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 1 0 0 1 0 0 0 0 0 0 7 0 0 0 0 0 1 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 1 0 0 0 0 0 0 0 10 0 0 1 0 0 0 0 0 0 0 0 0 1 0 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Aufgabenstellung In dieser Aufgabe vertiefen wir unser Verständnis der binären Bäume durch Implementierung derselben. In der Vorlesung haben Sie neben den Klassen TreeNode (zur Realisierung eines Baumknotens) und Tree (zur Verwaltung des gesamten Binärbaums) insbesondere auch viele mögliche Methoden der Klasse Tree (wie z. B. inorderiter, siehe auch Aufgabe 141) bereits theoretisch und am Beispiel kennengelernt. a) Implementieren Sie die Klasse TreeNode im Paket mypack.tree. Verwenden Sie als Datentyp für den key einen char. b) Implementieren Sie die Klasse Tree im Paket mypack.tree. Bauen Sie im Konstruktor der Klasse per Hand durch sukzessives Erzeugen und Verketten aller Baumknoten den Beispielbaum II aus Aufgabe 141 auf.

Aufgabenstellung c) Die vorgegebene Klasse TreeTest im Paket mypack erzeugt dann den Beispielbaum II über den Konstruktor von Tree und ruft zur Ausgabe des Baums in Zwischenordnung nacheinander die Methoden inorderrec und inorderiter der Klasse Tree auf. Implementieren Sie die beiden Methoden inorderrec und inorderiter in der Klasse Tree! Für die Methode inorderiter benötigen Sie zusätzlich das Interface Stack und die drei Klassen StackAsArray, StackOverflowException und StackUnderflowException aus der Vorlesung, die Sie alle vier im Paket mypack.stack implementieren. Testen Sie Ihre Anwendung ausgiebig! Beachten Sie die Vorgaben Uebung142.zip zur Aufgabenstellung.

Beispielbaum II aus Aufgabe 141 - + / a * d e - b! c 2

zu a (die Klasse TreeNode) - Vorgehensweise: siehe Folie M34 und M51 setze key als char-variable Konstruktor mit Parametern für alle drei Attribute set- und get-methoden für für alle drei Attribute

zu a (die Klasse TreeNode) - Programmcode: package mypack.tree ; // s i e h e F o l i e M34 und M51 public class TreeNode private char key; private TreeNode leftchild ; private TreeNode rightchild ; public TreeNode ( char k, TreeNode lc, TreeNode rc) key = k; leftchild = lc; rightchild = rc; // set Methoden public void setkey ( char key) this.key = key ; public void setleftchild ( TreeNode leftchild ) this. leftchild = leftchild ; public void setrightchild ( TreeNode rightchild ) this. rightchild = rightchild ; // get Methoden public char getkey () return key ; public TreeNode getleftchild () return leftchild ; public TreeNode getrightchild () return rightchild ;

zu b (die Klasse Tree) - Vorgehensweise: siehe Folie M34 und M52 im Konstruktor den Beispielbaum II aus Aufgabe 141 aufbauen es werden Methoden benötigt, die den Baum in Zwischenordnung ausgeben: public void inorderrec(): ruft die Hilfsfunktion inorderrechelp mit dem Parameter root auf, da root außerhalb der Klasse nicht sichtbar ist private void inorderrechelp(treenode current): Implementierung analog zu preorder von Folie M59 public void inorderiter(): ruft die Hilfsfunktion inorderiterhelp mit dem Parameter root auf, da root außerhalb der Klasse nicht sichtbar ist private void inorderiterhelp(treenode current): Implementierung analog zu Folie M60 Hinweis: der Eintrag current = s.top().getrightchild(); muss durch current = ((TreeNode)(s.top())).getRightChild(); ersetzt werden! Für diese Methode müssen zusätzlich folgende Klassen implementiert werden (sollte schon vorhanden sein Aufgabe 131): Stack (I17) StackAsArray (I18-I19) StackOverflowException (I20) StackUnderflowException (I20)

zu b (die Klasse Tree) - Programmcode: package mypack.tree ; import mypack. stack.*; // s i e h e F o l i e M34 und M52 public class Tree private TreeNode root ;

zu b (die Klasse Tree) - Programmcode: public Tree () // von Hand Baum I I aus Aufgabe 141 aufbauen root = new TreeNode ( -,null, null ); root. setleftchild ( new TreeNode ( +,null, null )); root. setrightchild ( new TreeNode ( /,null, null )); root. getleftchild (). setleftchild ( new TreeNode ( a,null, null )); root. getleftchild (). setrightchild ( new TreeNode ( *,null, null )); root. getrightchild (). setleftchild ( new TreeNode ( d,null, null )); root. getrightchild (). setrightchild ( new TreeNode ( e,null, null )); root. getleftchild (). getleftchild (). setleftchild ( new TreeNode ( -,null, null )); root. getleftchild (). getrightchild (). setleftchild ( new TreeNode ( b,null, null )); root. getleftchild (). getrightchild (). setrightchild ( new TreeNode ( ^,null, null )); root. getleftchild (). getrightchild (). getleftchild (). setrightchild ( new TreeNode (!,null, null )); root. getleftchild (). getrightchild (). getrightchild (). setleftchild ( new TreeNode ( c,null, null )); root. getleftchild (). getrightchild (). getrightchild (). setrightchild ( new TreeNode ( 2,null, null ));

zu b (die Klasse Tree) - Programmcode: // s i e h e F o l i e M59 public void inorderrec () inorderrechelp (root ); System.out. println (); private void inorderrechelp ( TreeNode current ) if( current == null ) return ; inorderrechelp ( current. getleftchild ()); System.out. print( current. getkey () + " "); inorderrechelp ( current. getrightchild ());

zu b (die Klasse Tree) - Programmcode: // s i e h e F o l i e M60 public void inorderiter () inorderiterhelp (root ); System.out. println (); private void inorderiterhelp ( TreeNode current ) Stack s = new StackAsArray (); boolean stop = false ; try do while ( current!= null ) s.push ( current ); current = current. getleftchild (); if(s. empty ()) stop = true ; else System.out.print ((( TreeNode )(s.top ())). getkey () + " "); current = (( TreeNode )(s.top ())). getrightchild (); s.pop (); while (! stop );

zu b (die Klasse Tree) - Programmcode: catch ( Exception e) System.out. println (e);

zu c (die Klasse TreeTest) - Vorgehensweise: ein Objekt der Klasse Tree anlegen mit den Methoden inorderrec und inorderiter den Baum in Zwischenordnung ausgeben (in beiden Fällen sollte - a + b! * c ^ 2 - d / e ausgegeben werden).

zu c (die Klasse TreeTest) - Programmcode: package mypack ; import mypack.tree.tree ; public class TreeTest public static void main( String [] args) // Baum aufbauen ( im Konstruktor von Tree ) Tree derbaum = new Tree (); // Baum r e k u r i v und i t e r a t i v i n Zwischenordnung ausgeben derbaum. inorderrec (); derbaum. inorderiter ();