Hallo zusammen,
habe hier einen schönen Binärbaum, der auch vollständig funktioniert.
Rekusrives InOrder geht auch einwandfrei.
Nun soll die InOrderausgabe jedoch iterativ gelößt werden.
Gar nicht so einfach... das schöne an der Rekursion ist ja, dass ich mich bis unten hin hangel und dann von unten nach oben aufarbeite.
Geht ja leider mit einer iterativen Lösung nicht.
Ich weiß jedoch, dass ich jede Rekursion zu einer Whileschleife umwandeln kann.
Meine Idee ist, dass es eine ineinander verschachtelte While-Schleife mit insgesamt 3 whiles sein muss.
Also wenn ich nach ganz unten links will, kein Problem. Wäre über Lösungshinweise oder gleich die ganze Lösung sehr dankbar.
Hier mein Code: (Hinweis, wer sich nur den relevanten Teil anschauen möchte, sollte von unten beginnen zu lesen. Die letzten beiden Methoden sind die relevanten.)
Aller besten Dank und Gruß schon mal
habe hier einen schönen Binärbaum, der auch vollständig funktioniert.
Rekusrives InOrder geht auch einwandfrei.
Nun soll die InOrderausgabe jedoch iterativ gelößt werden.
Gar nicht so einfach... das schöne an der Rekursion ist ja, dass ich mich bis unten hin hangel und dann von unten nach oben aufarbeite.
Geht ja leider mit einer iterativen Lösung nicht.
Ich weiß jedoch, dass ich jede Rekursion zu einer Whileschleife umwandeln kann.
Meine Idee ist, dass es eine ineinander verschachtelte While-Schleife mit insgesamt 3 whiles sein muss.
Also wenn ich nach ganz unten links will, kein Problem. Wäre über Lösungshinweise oder gleich die ganze Lösung sehr dankbar.
Hier mein Code: (Hinweis, wer sich nur den relevanten Teil anschauen möchte, sollte von unten beginnen zu lesen. Die letzten beiden Methoden sind die relevanten.)
Java:
class BinTree{
private Integer item; // In Aufgabe: wert
private BinTree left, right; // links, rechts
BinTree search(Integer item){
BinTree iter = this;
while (iter.item != null){
if (iter.item < item)
iter = iter.right;
else if (iter.item > item)
iter = iter.left;
else // Hier gilt: iter.item == item
return iter; // Knoten gefunden
}
return iter; // Einfuegestelle gefunden
}
void insert(Integer item){
// Finde Einfuegeposition
BinTree node = search(item);
if (node.item != null)
return; // Wert bereits enthalten
// Forderung aus Aufgabenstellung
node.item = item;
node.left = new BinTree();
node.right = new BinTree();
}
private void remove1(){
// Hier gilt: Knoten hat Wert und zwei BinTrees
// Hoechstens einer der beiden hat einen Wert.
// Waehle einen Sohn, der Wert besitzt
// oder egal welchen Sohn wenn keiner einen hat.
BinTree son = right;
if (left.item != null)
son = left; // Hochschieben des Sohns
this.item = son.item;
this.left = son.left;
this.right = son.right;
}
private void remove2(){
// Hier gilt: Knoten hat Wert und zwei BinTrees
// Beide haben einen Wert
// Finde linkesten Knoten im rechten BinTree
BinTree leftest = right;
while (leftest.left.item != null)
leftest = leftest.left;
// Hier gilt: leftest hat keinen linken Nachbarn
item = leftest.item;
leftest.remove1();
}
void remove(Integer item){
BinTree node = search(item);
if (node.item == null)
return; // Wert nicht enthalten
// Hier gilt: node hat Wert und zwei BinTrees
// Pruefe ob Knoten zwei oder weniger Nachfolger hat
if (node.left.item != null && node.right.item != null)
node.remove2(); // zwei Nachfolger
else
node.remove1(); // weniger
}
//InOrder Ausgabe
void inOrderRek(){
if (left != null)
left.inOrderRek();
if (item != null)
System.out.print(item+" ");
if (right != null)
right.inOrderRek();
}
void inOrderIter(){
BinTree iter = this;
while (iter.left.left!=null){
iter=iter.left;
System.out.print(iter.item+" ");}
}
}
Aller besten Dank und Gruß schon mal
Zuletzt bearbeitet: