Iterator erneut!

ocsme

Top Contributor
Guten Tag,

Aufgabenstellung (Menge als Suchbaum):
Implementieren sie für die Klasse TreeSet die Methode iterator(). Der Iteraltor soll die Elemente der Menge iterativ in aufsteigender Ordnung durchlaufen.

Java:
public class TreeSet<T extends Comparable<T>> implements Set<T> {
    
    protected class Node {
        T value;
        Node left, right;
        Node(T v) {
            value=v;
        }
    }
    
    protected Node root = null;
    
    @Override
    public Iterator<T> iterator() {
        
    }

Außerdem sei eine Implementierung der Klasse Stack<T> gegeben.
Code:
class Stack<T> extends Vector<T> {
    boolean empty() { ... }
    T pop () { ... }
    T push(T itme) { ... }
    int size() { ... }
}


Eigentlich dachte ich, das ich sowas verstanden habe doch leider nicht wirklich.
Mein Code würde so aussehen:
Java:
public class TreeSet<T extends Comparable<T>> implements Set<T> {
    
    protected class Node {
        T value;
        Node left, right;
        Node(T v) {
            value=v;
        }
    }
    
    protected Node root = null;
    
    @Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {
            Node current = root;
            Stack<T> s = new Stack<>();
            
            public boolean hasNext() {
                if(current.left != null || current.right != null) {
                    s = inorder(current,s);
                    return true;
                }
                else return false;
            }
            
            public T next() {
                if(!s.isEmpty())       
                    return s.pop();
                else return null;
            }
            
            private Stack<T> inorder(Node root, Stack<T> s) {
                if(root!=null) {
                    inorder(root.left,s);
                    s.push(root.value);
                    inorder(root.right,s);
                }
                return s;
            }
        };
    }

Das Problem ist nur wenn in einer while Schleife hasNext() immer wieder neu aufgerufen wird hängt er bei der größten Zahl in einer endloßschleife Fest!

Doch leider ist mir nichts besseres eingefallen.
Ich wollte erst im Suchbaum ganz nach rechts dann die Zeiger ändern und dann weiter machen. Doch auch das habe ich nicht hin bekommen da ich ja ein T zurück geben muss bei Next() hatte ich das Problem current zu verändern so das ganz rechts das Element weg fällt.

Kann mir dabei jemand weiter Helfen?

LG
 

ocsme

Top Contributor
Vielleicht ist das hier ja auch zulässig?
Ich hab einfach eine neue Klasse erstellt die mir den Stack im Konstruktor füllt und könnte dann mit dem Stack arbeiten.
Darf man so etwas tun?

Java:
@Override
    public Iterator<T> iterator() {
        return new SetIterator(root);
    }
    
    class SetIterator implements Iterator<T> {
        Stack<T> s = new Stack<T>();
        SetIterator(Node root) {
            s = inorder(root,s);
        }
        @Override
        public boolean hasNext() {
            return s.isEmpty()?false:true;
        }

        @Override
        public T next() {
            if(hasNext())
                return s.pop();
            return null;
        }
        
        private Stack<T> inorder(Node root, Stack<T> s) {
            if(root!=null) {
                inorder(root.left,s);
                s.push(root.value);
                inorder(root.right,s);
            }
            return s;
        }
        
    }
 

ocsme

Top Contributor
Hallo,
leider weiß ich nicht was successor(n) sind :(
Hab es gerade mal gegooglet und auf die schnelle bin ich nicht so wirklich schlau draus geworden.

Das Problem bei mir wenn ich es komplett Iterativ versuche eben das return T. Ich sitze irgendwann ganz weit unten im Baum mit meinem Zeiger und komme nicht wieder hoch.
Das ganze war mir dann zu doof, da in der Aufgabe ein Stack mit Implementiert war dachte ich so sollte es auch gehen :)

Vielleicht lässt sich mein Problem ja mit successor(n) beseitigen. Werde mir das mal anschauen.

Danke @mihe7
 

ocsme

Top Contributor
Die gegebene Klasse TreeSet darf nicht verändert werden.

Hab diesen Link gefunden :)

Doch dort wird der Parent in der Node gespeichert. Das dürfte man eben nicht. Bestimmt wurde deswegen auch der Stack mit angegeben. Denn ich hab mir den Kopf zerbrochen es ohne eine andere Datenstruktur zu machen und kam auf kein Ergebnis (was ja nichts heißt :D).

In dem anderen Thread würde ja nur das speichern des Vater Vater Knoten fehlen dann sollte es gehen hoffe ich :p

LG
 

mihe7

Top Contributor
Nehmen wir einmal an, path wäre der Pfad zum Knoten mit dem Nachfolger. Dann wäre der darauf folgende In-Order-Nachfolger das linke Blatt des rechten Teilbaums - sofern ein solcher existiert.

Falls kein rechter Teilbaum existiert, kann man den Pfad so lange zurückgehen, bis man auf einen Knoten trifft, der die Wurzel eines linken Teilbaums darstellt. Sofern ein solcher existiert, ist dessen Elternknoten der Nachfolger.

Achtung: nicht getestet (nur hier reingeschrieben)
Java:
class TreeIterator implements Iterator<T> {
    Deque<Node> path = new ArrayDeque<>();

    public TreeIterator() {
        if (root != null) {
            appendPathToFirstLeaf(root);
        }
    }

    public boolean hasNext() { return !path.isEmpty(); }

    public T next() {
        if (!hasNext()) { throw new NoSuchElementException(); }
        Node current = path.peekLast();
        T result = current.value;
        if (current.right != null) {
            appendPathToFirstLeaf(current.right);
        } else {
            do {
                current = path.removeLast();
            } while (!path.isEmpty() && path.peekLast().left != current);
        }
        return result;
    }

    private void appendPathToFirstLeaf(Node root) {
        Node current = root;
        while (current != null) {
            path.push(current);
            current = current.left;
        }
    }
}
 

ocsme

Top Contributor
Entschuldigung ich kam heute erst dazu mir deine Lösung an zu schauen :)

Finde deine Lösung schöner als die meine :)
Ich kannte auch das Prinzip der Deque bis dorthin nicht :p (ja wir müssen noch viel Lernen ;))

Nochmals Danke @mihe7 :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
N Kann man einen Iterator nur einmal verwenden Java Basics - Anfänger-Themen 5
N Warum Springt iterator nur in der Schleife weiter Java Basics - Anfänger-Themen 9
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
J Methoden Die Reihenfolge der Iterator-Elemente umkehren Java Basics - Anfänger-Themen 3
J Methoden iterator for-schleife (hasNext() ) Java Basics - Anfänger-Themen 7
Stargirlxo Iterator + Methode Java Basics - Anfänger-Themen 10
G Java Listen und Iterator Java Basics - Anfänger-Themen 2
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
F nur das erste Element mit iterator ausgeben Java Basics - Anfänger-Themen 5
O Iterator für eine geordnete Menge Java Basics - Anfänger-Themen 134
J Doppelte Ausgabe erzeugen Iterator Java Basics - Anfänger-Themen 6
K Iterator zurückliefern Java Basics - Anfänger-Themen 8
W Eigener Iterator soll mehrdimensionales Array durchlaufen Java Basics - Anfänger-Themen 4
S Iterator einer Liste Java Basics - Anfänger-Themen 4
B Sortieren mit Iterator Java Basics - Anfänger-Themen 4
I Erste Schritte Iterator Java Basics - Anfänger-Themen 3
M Iterator funktioniert nicht Java Basics - Anfänger-Themen 5
M Iterator cannot refer to a non final... Java Basics - Anfänger-Themen 20
O Interface Iterator Java Basics - Anfänger-Themen 2
M Collections Frage Beispielprogrammierung Iterator Java Basics - Anfänger-Themen 13
M Iterator Java Basics - Anfänger-Themen 25
J Iterator Funktioniert nicht richtig in StackImplementierung Java Basics - Anfänger-Themen 3
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
L Iterator Java Basics - Anfänger-Themen 1
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
M Collections Iterator und generischer Baum Java Basics - Anfänger-Themen 0
O Kleine Frage zu Iterator und Iterable Java Basics - Anfänger-Themen 6
OnDemand Iterator Interfacve Java Basics - Anfänger-Themen 23
S Iterator next() Nullpointer Java Basics - Anfänger-Themen 2
T Methoden Iterator über ArrayList Java Basics - Anfänger-Themen 3
W Iterator Java Basics - Anfänger-Themen 2
D Aufgabe: Stack mit Iterator Java Basics - Anfänger-Themen 8
R Mit iterator auf Element zugreifen Java Basics - Anfänger-Themen 2
T Collections Zugriff auf Elemente aus Iterator() Schleife Java Basics - Anfänger-Themen 4
P Casting Warning bei Iterator Java Basics - Anfänger-Themen 32
F Wie Werte einer ArrayList an einen 'Custom'-Iterator übergeben? Java Basics - Anfänger-Themen 2
J Iterator Java Basics - Anfänger-Themen 5
P ArrayList mit Iterator / Iterable ausgeben Java Basics - Anfänger-Themen 8
B Funktionsweise Iterator unklar Java Basics - Anfänger-Themen 7
A Datentypen Iterator von hinten nach vorne durchlaufen Java Basics - Anfänger-Themen 4
D Wie Iterator Remove implementieren? Java Basics - Anfänger-Themen 11
B Datentypen Inhalt zum Iterator wieder aufrufen? Java Basics - Anfänger-Themen 10
D Iterator schaltet nicht weiter?! Java Basics - Anfänger-Themen 5
A Problem mit Iterator Java Basics - Anfänger-Themen 2
B Türme von Hanoi - Iterator Java Basics - Anfänger-Themen 50
V Hilfe beim implementieren von Iterator Java Basics - Anfänger-Themen 5
W Collections Iterator<E> Java Basics - Anfänger-Themen 7
L Lokale Variable und Instanzvariable innerhalb Iterator Java Basics - Anfänger-Themen 8
W OOP problem mit iterator! -.- Java Basics - Anfänger-Themen 9
B Iterator und Collection Java Basics - Anfänger-Themen 11
ruutaiokwu Iterator oder .size ??? Java Basics - Anfänger-Themen 6
vandread Iterator zählt nicht hoch?! Java Basics - Anfänger-Themen 3
L Problem mit Iterator bzw. Sortierte Liste Java Basics - Anfänger-Themen 14
N HashMap mit Iterator durchlaufen Java Basics - Anfänger-Themen 11
R Iterator Liste, Verständnisproblem Java Basics - Anfänger-Themen 4
J Verschachtelte for-Schleife mit Löschen von Iterationen. Wie über Iterator abbilden? Java Basics - Anfänger-Themen 6
M Iterator Java Basics - Anfänger-Themen 15
L Implementation gesucht - ArrayList.iterator() Java Basics - Anfänger-Themen 3
M Eigener Iterator für LinkedList Java Basics - Anfänger-Themen 20
pun Iterator über ArrayList Java Basics - Anfänger-Themen 12
P Iterator.add() Java Basics - Anfänger-Themen 3
A For Schleife - Iterator wird null Java Basics - Anfänger-Themen 7
? Map und iterator Java Basics - Anfänger-Themen 11
0x7F800000 ungereimtheiten mit Iterator/ListIterator Java Basics - Anfänger-Themen 2
N "Dynamischer" Iterator Java Basics - Anfänger-Themen 21
J Iterator remove()? Java Basics - Anfänger-Themen 5
T Liste mit Iterator auslesen Java Basics - Anfänger-Themen 11
Kr0e Iterator Java Basics - Anfänger-Themen 2
D iterator instanziieren! Java Basics - Anfänger-Themen 11
M Der Umgang mit Iterator - Wie ein Objekt aus einer ArrayList Java Basics - Anfänger-Themen 2
J ArrayList mit Iterator Java Basics - Anfänger-Themen 3
W Iterator in Queue Java Basics - Anfänger-Themen 5
A Für was Iterator ? Java Basics - Anfänger-Themen 3
M warum interface iterator verwendbar? Java Basics - Anfänger-Themen 5
O Iterator - Durchlauf "einschränken" bzw. steuern&q Java Basics - Anfänger-Themen 2
K Collection und Iterator Java Basics - Anfänger-Themen 7
Q Iterator next erstellen Java Basics - Anfänger-Themen 4
S iterator problem Java Basics - Anfänger-Themen 3
S Iterator --__-- Zugriff auf nächstes Element Java Basics - Anfänger-Themen 5
N Set + Iterator oder doch nur zu blöd API zu lesen Java Basics - Anfänger-Themen 32
R Java 5.0 neue For schleife Iterator was ist der fehler? Java Basics - Anfänger-Themen 5
N generische HashMap und Iterator Java Basics - Anfänger-Themen 2
R Iterator und HashMap Java Basics - Anfänger-Themen 10
G Probleme mit Iterator Java Basics - Anfänger-Themen 2
E umgededrehte if anweisung funzt nicht , iterator. Java Basics - Anfänger-Themen 2
A Iterator, wie funkioniert das richtig? Java Basics - Anfänger-Themen 6
S Iterator Schreibweise Java Basics - Anfänger-Themen 7
P ArrayList, iterator: Fehler in while Schleife Java Basics - Anfänger-Themen 2
T Iterator Java Basics - Anfänger-Themen 8
G Frage zur Iterator ? Java Basics - Anfänger-Themen 12
A Iterator auf anfang setzen Java Basics - Anfänger-Themen 5
blackfeet Bildfadeffekt (Halptransparenz) & iterator Java Basics - Anfänger-Themen 8
C Problem mit verschachteltem Iterator Java Basics - Anfänger-Themen 2
R Problem mit Iterator Java Basics - Anfänger-Themen 6
M Problem mit Iterator.remove() Java Basics - Anfänger-Themen 5
R Enumeration oder Iterator? Java Basics - Anfänger-Themen 2
J Klasse Iterator Java Basics - Anfänger-Themen 5
D unregelmäßige NullPointerException bei LinkedList Iterator? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben