Übung 1: Bearbeiten binärer Baumknoten in - oth

Werbung
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
Herunterladen