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 ();