DFS没有记忆的树

时间:2012-03-15 15:38:33

标签: java algorithm tree

我正在尝试使用深度优先搜索来编写一个遍历树的函数。

我当前的算法类似于:

If children
 go to first child

If no children
 go to next sibling

If no siblings
 go to parent

我遇到的问题是我无法将树上的节点标记为已访问过,所以当我转到父节点时,循环只会重置并再次传给孩子,陷入循环。有没有人知道如何解决这个问题?

(在使用ANTLR插件的java中)

编辑:

根据我写的一条建议:

public void traverseTree(Tree tree){

    if (tree.getChildCount() > 0){
        tree = tree.getChild(0);
        traverseTree(tree);
        System.out.println(tree.toString());
    }
    if (tree.getParent().getChild(tree.getChildIndex() + 1) != null){
        tree = tree.getParent().getChild(tree.getChildIndex() + 1);
        traverseTree(tree);
        System.out.println(tree.toString());
    }
    if (!tree.getParent().toString().contains("ROOT_NODE")){
        tree = tree.getParent();
        traverseTree(tree);
        System.out.println(tree.toString());
    }
}

Root节点是根节点的名称,但是我收到了堆栈溢出错误。任何人都知道为什么?

感谢。

4 个答案:

答案 0 :(得分:3)

在这种情况下,我会使用递归。

class Node {
   public List<Node> getChildren() { .... }

   public void traverse(Visitor<Node> visitor) {
      // If children
      // go to first child - by traversing the children first.
       for(Node kid: getChildren())
           kid.traverse(visitor);
           // If no children
           //  go to next sibling, - by continuing the loop.

       visitor.visit(this);
       // If no siblings
       // go to parent - by returning and letting the parent be processed
   }
}


interface Vistor<N> {
   public void visit(N n);
}

答案 1 :(得分:0)

使用hash_table映射将每个顶点设置为boolean指示是否访问

答案 2 :(得分:0)

编写深度优先的迭代器,在内部跟踪访问的节点。这样,树就不必改变就知道它正在被监视。

答案 3 :(得分:0)

如果&#34;没有记忆&#34;可以解释为O(1)内存,然后更改可能会有所帮助:

  1. 不仅要记住当前节点,还要记住您来自的节点
  2. 只有当你没有来自其中一个孩子时才会穿越孩子