BST的迭代方法

时间:2012-10-08 22:18:11

标签: java stack binary-search-tree

这些是我的领域:

public class BSTSet <E> extends AbstractSet <E> {

    // Data fields
    private BSTNode root;
    private int count = 0;
    private Comparator<E> comp;   // default comparator

    /** Private class for the nodes.
     *  Has public fields so methods in BSTSet can access fields directly. 
     */
    private class BSTNode {

        // Data fields

        public E value;
        public BSTNode left = null;
        public BSTNode right = null;

        // Constructor

        public BSTNode(E v) {
            value = v;
        }

        //creates a method called contains so that i can call it later on for my find method
        public boolean contains(Object item) {
            return contains(item);//root.value.equals(item);
        }

        public int height() {
            return height();
        }

    }
    // Constructors - can either use a default comparator or provide one
    public BSTSet() {
        comp = new ComparableComparator();      // Declared below
    }

    public BSTSet(Comparator <E> c) {
        comp = c;
    }
}

这就是我想要完成的事情:

private class BSTSetIterator implements Iterator<E> {

    private Stack<BSTNode> stack = new Stack<BSTNode>();
    private BSTNode current = root;

    public BSTSetIterator(BSTNode root) {

         return new BSTSetIterator();

    }

    public boolean hasNext() {

        boolean hasNext = false;
        hasNext = !stack.isEmpty() || current != null;
        return hasNext;

    }

    public E next() {

        BSTNode next = null;

        while (current != null) {
            stack.push(current);
            current = current.left;
        }
        next = stack.pop();
        current = next.right;

        return next;

    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}
// Comparator for comparable 

private class ComparableComparator implements Comparator<E> {
    public int compare(E ob1, E ob2) {
        return ((Comparable)ob1).compareTo(ob2);
    }
}

到目前为止,代码在行return new BSTSetIterator();return next;处失败。对于return next,它表示返回的数据类型错误。我将如何修复这些方法,以便我可以使用Stack迭代BST?

1 个答案:

答案 0 :(得分:2)

BSTSetIterator();

这不起作用,因为构造函数需要root并且您没有传递该参数。如果你有一个名为'tree'的BSTSet对象,并且你想创建一个新的迭代器,那么你应该用这种方式创建迭代器:

BSTSetIterator iterator = new BSTSetIterator(tree.getRoot());

但是,您的BSTSet类中没有getter,并且您的root是私有的。不用担心,该问题的解决方案是在BSTSetIterator类中创建一个公共getter,如下所示:

public BSTNode getRoot()
{
    return this.root;
}

构造函数不返回值,这是不正确的:

 public BSTSetIterator(BSTNode root) {
         return new BSTSetIterator();
    }

相反,用这种方式写下你的建设者:

public BSTSetIterator(BSTNode root)
{
    this.current = root;
}

此外,此定义不正确,因为root无法访问:

private BSTNode current = root;

你应该改为:

private BSTNode current;

至于你的其他问题,

BSTNode next = null;

表示名为“next”的变量属于BSTNode类型。

public E next()

表示您调用next的方法是E类型。因为E和BSTNode不一样,你的回报是:

return next;

不正确。我可以给你更多帮助,但我已经意识到你现在正在学习语言,最好让你自己探索一下技术和编程,因为这样你就会变得更快。 “给一个人一条鱼,你喂他一天。教一个人如何钓鱼,你喂他一辈子。”