Как настроить конструктор для класса Iterator со стеком? - PullRequest
0 голосов
/ 21 апреля 2019

Мне нужна помощь в настройке этого конструктора для моего класса Iterator.Направления следующие:

Конструктор должен создать новый стек и поместить в него свой параметр узла, а затем все оставшиеся дочерние элементы, доступные из этого параметра.Рассмотрим случай, когда дерево состоит только из левых потомков (по сути, это связанный список).Узел с самым высоким значением (root) будет помещен первым и будет находиться в нижней части стека, за ним следует его левый дочерний элемент чуть выше него в стеке, за которым следует его левый дочерний элемент, и так далее до листа, который будет содержатьсамое низкое значение в дереве.При извлечении узлов из стека они будут содержать значения от низшего к высшему… обход по порядку.

Я не уверен, как создать новый стек с узлом в параметре, являющимся типом типа BSTNode.

Вот мой код:

public static class Iterator<E>
    {
        private Stack<BSTNode<E>> stack;

        public Iterator(BSTNode<E> node)
        {

        }
        public boolean hasNext()
        {
            if(stack.peek() != null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public E next()
        {
            stack.pop();
            E value;
            value = (E) stack.pop();
            return value;
        }
    }

На данный момент, просто игнорируйте два других метода, мне просто нужна помощь с методом Iterator.Я выясню это позже.Спасибо.

Я обнаружил, что моя проблема в другом классе и методе.Я настроил это так, и я хочу знать, является ли это правильным способом сделать это.

Инструкции для этого метода:

для создания и возврата экземпляра статического вложенного класса Iterator, который будет использоваться для перебора элементов дерева.Корень дерева изначально должен быть передан в конструктор итератора.

Вот следующий код, который я сделал для этого метода:

 public Iterator<E> iterator()
    {
        return new Iterator<>(root);
    }

root - вершина дерева двоичного поиска,Именно в этом классе как частная переменная

1 Ответ

0 голосов
/ 24 апреля 2019

Вот как я это настроил.

Это просто публика, которая выше класса. Не внутри класса. Я просто возвращаю новый итератор с корнем, являющимся верхним значением.

public Iterator<E> iterator()
    {
        return new Iterator<>(root);
    }

Затем внутри класса под ним я создаю новый стек, и этот стек сдвигает узлы и узлы слева от него, пока он не равен нулю.

public static class Iterator<E>
    {
        private Stack<BSTNode<E>> stack;

        public Iterator(BSTNode<E> node)
        {
            this.stack = new Stack<>();
            while (node != null)
            {
                stack.push(node);
                node = node.left;
            }
        }
        public boolean hasNext()
        {
            return !stack.isEmpty();
        }
        public E next()
        {
            BSTNode<E> goodDays = stack.pop();
            E result = goodDays.data;
            if (goodDays.right != null)
            {
                goodDays = goodDays.right;
                while (goodDays != null)
                {
                    stack.push(goodDays);
                    goodDays = goodDays.left;
                }
            }
            return result;
        }
    }
...