如何在Java中为DAG结构创建迭代器包装器?

时间:2010-11-15 13:26:24

标签: java tree iterator visitor directed-acyclic-graphs

我希望在数据结构上有一个迭代器。 现在我不知道什么是数据结构,可能它是一个DAG(有向无环图),但也许它也可能是一个链表。 所以我想把它包装成一个迭代器,现在不要考虑特定的数据结构。

我知道如何使用类似递归的访问者访问DAG, 但我无法找到一个简单而干净的结构来实现迭代器方法next()hasNext()

在迭代器中,我创建了一个当前节点实例,并在所有子节点上使用for循环进行迭代,然后返回到父节点。需要一个“已经访问过”的标志。 所以我的DagElement有更多属性:

DagElement parent
boolean alreadyVisited

我认为这不是一个干净的解决方案。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

将递归启发式转换为迭代启发式的快速方法是使用(LIFO)堆栈或(LILO)队列来保存“未采取的道路” - 找到但尚未采用的路径。在这种情况下,迭代器将具有堆栈或队列实例变量。类似的东西:

    class DagIterator<T>
    extends Iterator<T> {

        private Stack<DagNode<T>> nodes;

        private DagIterator(Dag<T> dag) {
            nodes.push(dag.getRootNode());
        }

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

        public T next() {
            final DagNode node = nodes.pop();
            for (final DagNode child : node.getChildren()) {
                nodes.push(child);
            }
            return node.getValue();
        }

    }

您可以根据数据结构(LIFO或LILO),子项排队的顺序以及排队时间来调整访问顺序。一些访问命令可能需要立即以正确的顺序排队整个节点集(在构造函数中),这并不令我感到惊讶。