1

I'm trying to write an implementation of iterator so that I can call it within my BST class, under iterator() method.

My solution (not sure if it would work correctly) is to use a stack or a queue to store the nodes of the BST. Trouble is, my Iterator Implementation class can't recognise my BST nodes when I pass the "root" node into its constructor.

For your ease of imagination, this is my BST implementation, it works fine for other methods including add, delete, etc. But I'm currently stuck at the iterator() method. Since I have no idea how to start and what to do.

   public class DictionaryImp<E extends Comparable<E>> implements Dictionary<E> {

        public class DictNode {
           public DictNode left;
           public DictNode right;
           public String position;
           public E value;

           public DictNode(E value, DictNode left, DictNode right, String position) {
               this.left = left;
               this.right = right;
               this.position = position;
               this.value = value;
           }
        }

       public DictNode root;

       //... more code

       public Iterator<E> iterator() {
             // provides a fail fast iterator for the Dictionary
             // starting at the least element greater than or equal to start
             Iterable<E> itr = new DictionaryItr<E>(root);
             Iterator<E> it = itr.iterator();
             return it;
       }
}

This is what I wrote for the Iterator implementation

public class DictionaryItr<E> implements Iterable<E> {
    public DictionaryItr(DictNode root) {
        first = null;
        this.inOrderTraversial(root);
    }

    public void inOrderTraversial(DictNode node) {
        if (node != null) {
            inOrderTraversial(node.left);
            first.push(node.value);
            inOrderTraversial(node.right);
        }
    }

    // more code: push, peek, pop

    public Iterator<E> iterator() {
        return new ListIterator();
    }
    private class ListIterator implements Iterator<E> {
        private Node current = first;
        public boolean hasNext()  { return current != null;                     }
        public void remove()      { throw new UnsupportedOperationException();  }

        public E next() {
            if (!hasNext()) throw new NoSuchElementException();
            E item = current.item;
            current = current.next; 
            return item;
        }
    }
}
5
  • What do you mean by "my Iterator Implementation class can't recognise my BST nodes"? Commented May 24, 2012 at 14:43
  • @Christian, the compiler displayed an error with respect to class not found, I guess it couldn't relate to the DictNode root Commented May 24, 2012 at 14:47
  • 1
    I have added the "homework" tag, because no one in their right mind would reinvent a wheel that exists in the JDK - just use a TreeSet Commented May 24, 2012 at 14:55
  • So the problem is not that it doesn't work but that it doesn't compile? Commented May 24, 2012 at 15:04
  • @John B: it doesn't compile yeah, I mean it displays some errors relating to the DictNode class Commented May 24, 2012 at 15:14

1 Answer 1

3

The DictNode class is an inner class. When you use it in another class, the inner class name must be qualified (with the name of the outer class) or imported.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.