Рекурсия в итеративную программу

Я пытался преобразовать рекурсивную программу в нерекурсивную программу. Цель программы - обход структуры данных.

Пожалуйста, найдите ниже структуру данных

class Node {
}

class LeafNode extends Node {
    private int leafNodeValue;

    public LeafNode (int leafNodeValue) {
        this.leafNodeValue= leafNodeValue;
    }

   public int getLeafNodeValue() {
      return leafNodeValue;
   }
   public void setLeafNodeValue(int leafNodeValue ) {
     this.leafNodeValue = leafNodeValue;
   }
}

class NonLeafNode extends Node {
    private List<Node> nodeList = new ArrayList<>();

    public List<Node> getNodeList() {
       return nodeList ;
    }
    public void setNodeList(List<Node> nodeList) {
       this.nodeList = nodeList;
    }
}

Вот мой рекурсивный класс обхода узлов, который мне не удается переписать нерекурсивно.

Класс рекурсивного обхода

public class RecursiveTraversal {
    public static void main (String[] args ) {
        NonLeafNode node1 = new NonLeafNode();

        NonLeafNode node2 = new NonLeafNode();
        node2.getNodeList().add(new LeafNode(1));

        NonLeafNode node3 = new NonLeafNode();
        node3.getNodeList().add(new LeafNode(2));

        node2.getNodeList().add(node3);

        NonLeafNode node4 = new NonLeafNode();
        node4.getNodeList().add(new LeafNode(3));

        node1.getNodeList().add(node2);
        node1.getNodeList().add(node4);
        node1.getNodeList().add(new LeafNode(4));

        for (Node nodeItem : node1.getNodeList())
            traverse(nodeItem);
    }

    public static void traverse (Node node) {
        if (node instanceof LeafNode)
            System.out.println(" Leaf Node " + ((LeafNode) node).getLeafNodeValue());
        else if (node instanceof NonLeafNode)
            for (Node nodeItem: ((NonLeafNode) node).getNodeList())
                traverse(nodeItem);
    }
}

Результат программы должен быть 1,2,3,4.

Может ли кто-нибудь помочь мне написать итеративную версию вышеуказанной программы?

class Node() { ... } это правильно в java?
Cid 25.09.2018 08:49

да, мой класс верхнего уровня - это RecursiveTraversal, все остальные классы содержатся в том же файле, я могу выполнить вывод программы, мог сделать некоторую ошибку при вводе текста в браузере, но в основном он должен работать с небольшими изменениями.

Mahesh 25.09.2018 08:50

У вас много ошибок компиляции. Исправьте и ждите помощи. Никто не должен исправлять вашу ошибку. Ваш вопрос касается итеративной логики, но код не работает.

drowny 25.09.2018 08:51

Шаг 1. Определите, что ваш рекурсивный метод - это Поиск в глубину. --- Шаг 2. Поищите в Интернете, как это сделать без рекурсии: non-recursive depth first search

Andreas 25.09.2018 08:53

удалены все ошибки компиляции, пожалуйста, проверьте сейчас

Mahesh 25.09.2018 09:29

Андреас, для меня работа по поиску в глубину, спасибо

Mahesh 25.09.2018 10:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
67
1

Ответы 1

Чтобы сделать его итеративным, просто используйте цикл while или for.

Так что-то вроде:

while(getLeafNode() != null) {
  // etc
}

Также:

prvate int leafNodeValue;

Наверное, частное должно быть, а не првате?

Другие вопросы по теме