我试图编写一个函数来遍历深度优先搜索的树。
我现在的算法是这样的:

If children
 go to first child

If no children
 go to next sibling

If no siblings
 go to parent

我遇到的问题是,我无法将树上的节点标记为已被访问,所以当我转到父节点时,循环会重置,然后再次转到子节点,陷入循环有人知道我怎么解决这个问题吗?
(它在java中使用ANTLR插件)
编辑:
以下是我写这篇文章的建议之一:
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());
    }
}

根节点是根节点的名称,但出现堆栈溢出错误有人知道为什么吗?
谢谢。

最佳答案

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

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);
}

10-07 18:58