Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DFS是一棵没有内存的树_Java_Algorithm_Tree - Fatal编程技术网

Java DFS是一棵没有内存的树

Java DFS是一棵没有内存的树,java,algorithm,tree,Java,Algorithm,Tree,我正在尝试编写一个函数,用深度优先搜索遍历一棵树 我目前的算法是这样的: If children go to first child If no children go to next sibling If no siblings go to parent 我遇到的问题是,我无法将树上的节点标记为已访问,因此当我转到父节点时,循环会重置,然后再次转到子节点,陷入循环中。有人知道我如何解决这个问题吗 (在java中使用ANTLR插件) 编辑: 以下是我写的建议之一: public vo

我正在尝试编写一个函数,用深度优先搜索遍历一棵树

我目前的算法是这样的:

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());
    }
}
Root node是根节点的名称,但是我得到了一个堆栈溢出错误。有人知道为什么吗


谢谢。

使用哈希表将每个顶点映射为布尔值表示是否访问

使用哈希表将每个顶点映射为布尔值表示是否访问

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

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);
}
类节点{
公共列表getChildren(){..}
公共空间遍历(访客){
//如果孩子
//转到第一个子对象-首先遍历子对象。
对于(节点kid:getChildren())
凯德·特拉弗斯(访客);
//如果没有孩子
//继续循环,转到下一个同级。
访客。访问(本);
//如果没有兄弟姐妹
//转到父级-返回并让父级处理
}
}
界面观察者{
公众访问(N);
}

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

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);
}
类节点{
公共列表getChildren(){..}
公共空间遍历(访客){
//如果孩子
//转到第一个子对象-首先遍历子对象。
对于(节点kid:getChildren())
凯德·特拉弗斯(访客);
//如果没有孩子
//继续循环,转到下一个同级。
访客。访问(本);
//如果没有兄弟姐妹
//转到父级-返回并让父级处理
}
}
界面观察者{
公众访问(N);
}

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

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

如果“无内存”可以解释为O(1)内存,那么更改可能会有帮助:

  • 不仅要记住当前节点,还要记住您来自的节点
  • 只有当你不是其中一个孩子的时候,才能遍历他们
  • 如果“无内存”可以解释为O(1)内存,则更改可能有助于:

  • 不仅要记住当前节点,还要记住您来自的节点
  • 只有当你不是其中一个孩子的时候,才能遍历他们

  • 在树搜索中,这应该是不必要的。在树搜索中,这应该是不必要的。如果您不需要担心周期或类似的问题,那么最简单的方法是使用@PeterLawrey建议的递归方法。干净简单。如果你不能使用递归,你仍然可以使用一个单独的堆栈来维护相同的信息,包括返回位置的链接列表,如果节点没有反向链接。如果你不需要担心循环或类似的问题,那么最简单的方法就是使用@PeterLawrey建议的递归方法。干净简单。如果你不能使用递归,你仍然可以使用一个单独的堆栈来维护相同的信息,包括要返回到哪里的链接列表,如果节点没有反向链接的话。这看起来不错,但我不确定我是否100%理解它。你能解释一下它到底在做什么吗?(对不起,我不太擅长阅读代码)。我添加了注释。您可能会发现,在调试器中一步一步地检查代码以查看它到底在做什么是很有用的。嗯,我曾尝试在java文件中编写代码来理解它,但在运行时遇到了问题,它无法识别Visitor或getChildren()(尽管我认为我只需要更改为奇怪的ANTLR格式)。好的,我想我明白了。我已经用我为其编写的代码更新了主要帖子(以使其在ANTLR中工作)。但我得到了一个堆栈溢出错误。看起来不错,但我不确定我是否100%理解它。你能解释一下它到底在做什么吗?(对不起,我不太擅长阅读代码)。我添加了注释。您可能会发现,在调试器中一步一步地检查代码以查看它到底在做什么是很有用的。嗯,我曾尝试在java文件中编写代码来理解它,但在运行时遇到了问题,它无法识别Visitor或getChildren()(尽管我认为我只需要更改为奇怪的ANTLR格式)。好的,我想我明白了。我已经用我为其编写的代码更新了主要帖子(以使其在ANTLR中工作)。但是我得到了一个堆栈溢出错误。