Algorithmen und Datenstrukturen Übung 1: Bearbeiten binärer Baumknoten in Java Gegeben ist der folgende Strukturbaum zur Darstellung der hierarchischen Struktur eines arithmetischen Ausdrucks. + * A + E * B C D Aufgaben: 1. Gib den Java -Quellcode zu einer Java-Anwendung an, die den vorstehenden Baum implementiert und anschließend durchwandert. Die Aufgabenlösung soll nur die Datenstruktur Baumknoten umfassen, der Baum soll lediglich über Algorithmen ermittelt bzw. bearbeitet werden. Das Durchwandern des Baums soll über rekursive Algorithmen realisiert werden und auf der Standardausgabe protokolliert werden. 2. Beachte den Präorder-Durchlauf nach der sog. WLR-Ordnung. Gib Methoden an für 1. den rekursiven Durchlauf 2. den Durchlauf ohne Verwendung der Rekursion Für die Implementierung des WLR-Durchlaufs ohne Rekursion benutze 1. einen Stapel, dessen Quellcode definiert bzw. implementiert werden soll. 2. einen Stack aus dem Paket java.util, der als Container „Vector“ verwendet. 1 Algorithmen und Datenstrukturen Lösungen: 1. Aufgabe import java.util.*; class Baumknoten { private char zeichen; private Baumknoten links, rechts; public Baumknoten(char z) { links = rechts = null; zeichen = z; } public Baumknoten(char z, Baumknoten l, Baumknoten r) { links = l; rechts = r; zeichen = z; } public char getZeichen() { return zeichen; } public Baumknoten getLinks() { return links; } public Baumknoten getRechts() { return rechts; } } public class TestBaumknoten { private static Baumknoten wurzel; private static void praeorderAusg(Baumknoten b) { // Rekursiver Durchlauf if (b == null) return; { System.out.print(b.getZeichen() + " "); praeorderAusg(b.getLinks()); praeorderAusg(b.getRechts()); } } private static void postorderAusg(Baumknoten b) { // Rekursiver Durchlauf if (b == null) return; { postorderAusg(b.getLinks()); postorderAusg(b.getRechts()); System.out.print(b.getZeichen() + " "); } } private static void inorderAusg(Baumknoten b) { // Rekursiver Durchlauf if (b == null) return; 2 Algorithmen und Datenstrukturen { inorderAusg(b.getLinks()); System.out.print(b.getZeichen() + " "); inorderAusg(b.getRechts()); } } private static void wlrnr(Baumknoten b) { Stack s = new Stack(); s.push(null); while (b != null) { System.out.print(b.getZeichen() + " "); if (b.getRechts() != null) s.push(b.getRechts()); if (b.getLinks() != null) b = b.getLinks(); else b = (Baumknoten) s.pop(); } } private static void wlrnrstaparr(Baumknoten b) { Stapel s = new Stapel(); s.push(null); while (b != null) { System.out.print(b.getZeichen() + " "); if (b.getRechts() != null) s.push(b.getRechts()); if (b.getLinks() != null) b = b.getLinks(); else b = (Baumknoten) s.topAndpop(); } } private static void main(String args[]) { Baumknoten h = new Baumknoten('C'); Baumknoten i = new Baumknoten('D'); Baumknoten d = new Baumknoten('A'); Baumknoten e = new Baumknoten('B'); Baumknoten b = new Baumknoten('*',d,e); Baumknoten f = new Baumknoten('*',h,i); Baumknoten g = new Baumknoten('E'); Baumknoten c = new Baumknoten('+',f,g); Baumknoten a = new Baumknoten('+',b,c); wurzel = a; // Rekursive Durchlaeufe praeorderAusg(wurzel); System.out.println(); inorderAusg(wurzel); System.out.println(); postorderAusg(wurzel); System.out.println(); // Nicht rekursiver Praeorder-Durchlauf mit dem Stack // aus java.util wlrnr(a); System.out.println(); // Nicht rekursiver Praeorder-Durchlauf mit einem // eigenen Stapel wlrnrstaparr(a); 3 Algorithmen und Datenstrukturen } } 2. Aufgabe public class Stapel { // Datenelemente private Object[] feld; private int topStapel; static final int DEFAULT_KAPAZITAET = 10; // Konstruktor public Stapel() { this(DEFAULT_KAPAZITAET); } public Stapel(int kapazitaet) { feld = new Object[kapazitaet]; topStapel = -1; // Initialisierung leerer Stapel } // Methoden public boolean istLeer() { return topStapel == -1; } public boolean istVoll() { return topStapel == feld.length - 1; } public void push(Object x) { if ( !istVoll() ) feld[++topStapel] = x; } public Object top() { if ( !istLeer() ) return feld[topStapel]; else return null; } public void pop() { if (!istLeer()) feld[topStapel--] = null; } public Object topAndpop() { if (!istLeer()) { Object topItem = top(); feld[topStapel--] = null; return topItem; } else return null; } } 4