algorithm - 在每个节点进行前后访问的迭代深度优先树遍历

标签 algorithm tree-traversal

谁能指出迭代深度优先树遍历的伪代码,其中可以在前序和后序对每个节点执行操作?

也就是说,在下降到一个节点的子节点之前的一个 Action ,然后是从子节点上升之后的一个 Action ?

此外,我的树不是二叉树 - 每个节点都有 0..n 个子节点。

基本上,我的案例是转换递归遍历,我在当前节点上执行前操作和后操作,递归的任一侧到子节点。

最佳答案

我的计划是使用两个堆栈。一种用于前序遍历,另一种用于后序遍历。 现在,我运行标准的迭代 DFS(深度优先遍历),一旦我从“pre”堆栈中pop,我就将它插入“post”堆栈。 最后,我的“post”堆栈将在顶部有子节点,在底部有根节点。

treeSearch(Tree root) {
    Stack pre;
    Stack post;
    pre.add(root);
    while (pre.isNotEmpty()) {
        int x = pre.pop();
        // do pre-order visit here on x
        post.add(x);
        pre.addAll(getChildren(x));
    }
    while (post.isNotEmpty()) {
        int y = post.pop();
        // do post-order visit here on y
    }
}

root 将始终从 post 堆栈中最后遍历,因为它将停留在底部。

这是简单的java代码:

public void treeSearch(Tree tree) {
    Stack<Integer> preStack = new Stack<Integer>();
    Stack<Integer> postStack = new Stack<Integer>();
    preStack.add(tree.root);
    while (!preStack.isEmpty()) {
        int currentNode = preStack.pop();
        // do pre-order visit on current node
        postStack.add(currentNode);
        int[] children = tree.getNeighbours(currentNode);
        for (int child : children) {
            preStack.add(child);
        }
    }

    while (!postStack.isEmpty()) {
        int currentNode = postStack.pop();
        // do post-order visit on current node
    }
}

我假设这是一棵树,所以:没有循环并且没有重新访问相同的节点。但是,如果我们愿意,我们始终可以拥有一个已访问数组并对其进行检查。

关于algorithm - 在每个节点进行前后访问的迭代深度优先树遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4664050/

相关文章:

c# - 快速排序算法抛出stackoverflow异常错误

c++ - 通过凹多边形计算位置聚类中心约束的最快方法是什么

python - if语句可以是变量吗?

javascript - 在性能方面,在算法复杂性方面,以下两个用于将字符串首字母大写的 JS 函数中哪个更好,为什么?

java - level-order, tree traversal - 如何跟踪级别?

jquery - 有效地沿着上下 sibling 遍历

c++ - 遍历树..内存访问冲突的顺​​序问题

c++ - 是否有用于解析小数的良好 C++ 工具?

algorithm - 广度优先与深度优先

c - 如何遍历多路树