Informatik in 13 mit Java Bäume: Einfügen und Suchen Gierhardt Im Unterricht wurden die folgenden Klassen entwickelt: c l a s s Knoten // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− { int i n h a l t ; Knoten l i n k s , r e c h t s ; Knoten ( i n t wert ) { t h i s . i n h a l t = wert ; this . l i n k s = null ; this . r e c h t s = null ; } } // c l a s s Knoten c l a s s BinaerBaum // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− { Knoten w u r z e l = n u l l ; void rekFuegeEin ( Knoten a s t , i n t wert ) { i f ( wert < a s t . i n h a l t ) { i f ( a s t . l i n k s == n u l l ) a s t . l i n k s = new Knoten ( wert ) ; e l s e rekFuegeEin ( a s t . l i n k s , wert ) ; } e l s e { i f ( a s t . r e c h t s == n u l l ) a s t . r e c h t s = new Knoten ( wert ) ; e l s e rekFuegeEin ( a s t . r e c h t s , wert ) ; } } // rekFuegeEin void f u e g e E i n ( i n t wert ) { i f ( w u r z e l == n u l l ) w u r z e l = new Knoten ( wert ) ; e l s e rekFuegeEin ( w u r z e l , wert ) ; } // f u e g e E i n void rekLaufeDurch ( Knoten a s t ) { i f ( a s t != n u l l ) { rekLaufeDurch ( a s t . l i n k s ) ; Out . p r i n t ( a s t . i n h a l t ) ; Out . p r i n t l n ( ) ; rekLaufeDurch ( a s t . r e c h t s ) ; } } // rekLaufeDurch void l a u f e D u r c h ( ) { i f ( w u r z e l != n u l l ) { rekLaufeDurch ( w u r z e l . l i n k s ) ; Out . p r i n t ( w u r z e l . i n h a l t ) ; Out . p r i n t l n ( ) ; rekLaufeDurch ( w u r z e l . r e c h t s ) ; } } // l a u f e D u r c h } // c l a s s BinaerBaum Eine Main-Klasse kann so aussehen: c l a s s BinBaumBsp0 { s t a t i c BinaerBaum baum ; public s t a t i c void main ( S t r i n g [ ] a r g ) { int zahl = 0 ; S t r i n g muell ; baum = new BinaerBaum ( ) ; Out . p r i n t ( ” B i t t e Zahlen e i n g e b e n . Ende mit −1. ” ) ; Out . p r i n t l n ( ) ; while ( z a h l != −1) { Out . p r i n t ( ” B i t t e Zahl e i n g e b e n : ” ) ; z a h l = In . r e a d I n t ( ) ; muell = In . readLine ( ) ; i f ( z a h l != −1) baum . f u e g e E i n ( z a h l ) ; } // w h i l e baum . l a u f e D u r c h ( ) ; } // main } // c l a s s BinBaumBsp0 1 Aufgaben: 1. In einer Klasse können zwei Methoden den gleichen Namen haben, wenn sie sich durch die Parameterliste unterscheiden. Dies bezeichnet man als Überladen. Die Auswahl der tatsächlich aufzurufenden Methode erfolgt zur Laufzeit anhand des Typs der aktuellen Parameter. Der Ergebnistyp muss allerdings immer gleich bleiben. Das dem Überladen übergeordnete Konzept der Objektorientierung ist die Polymorphie, was so viel wie Vielgestaltigkeit“ heißt. Ein weiteres Beispiel für Polymorphie ist die Verwendung des ” +-Operators, der bei Zahlen die Addition und bei Strings die Konkatenation bewirkt. Wende das Überladen bei den Methoden der Klasse BinaerBaum an. 2. Die Methode laufeDurch() ist zu umständlich formuliert. Vereinfache sie. 3. Der Baum soll nach bestimmten Inhalten durchsucht werden. Formuliere dazu eine Funktion gefunden(int zahl) und teste die Methode. Tipp: Überladen und natürlich Rekursion machen die Lösung einfach. 4. Die Klasse BinaerBaum wird um drei Konstanten ergänzt und die Methode laufeDurch erhält einen weiteren Parameter. Formuliere damit die Methoden um, damit der Baum auf verschiedene Arten durchlaufen werden kann. Teste die verschiedenen Arten aus. c l a s s BinaerBaum // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− { Knoten w u r z e l = n u l l ; f i n a l i n t INORDER = 1; f i n a l i n t PREORDER = 2 ; f i n a l i n t POSTORDER = 3 ; ... void l a u f e D u r c h ( i n t o r d e r ) ... } // c l a s s BinaerBaum 2