深度优先搜索:尝试计算具有特定特征的节点数量(java)

时间:2016-10-20 13:24:42

标签: java algorithm data-structures depth-first-search

我有一棵树,其中一些节点具有某种特征。我希望通过使用类似DFS的算法来计算树中具有此特性的节点数量。但是,我错误地使用了返回值。如果找到具有此特性的节点,我希望某种计数器递增,否则计数器不会递增。

这很简单,但我无法正确实现它。

    private int dfs(Node node) {

    for(Node n: node.children){ 
        if(n != null && n.someOtherCondition){
            return 1 + dfs(n);
        }
    }
    return 0;
    }

4 个答案:

答案 0 :(得分:0)

当找到匹配的节点时,不要立即返回:计算它们,并在结束时返回。

private int dfs(Node node) {
  int count = 0;
  for(Node n: node.children){ 
    if(n != null && n.someOtherCondition){
      count += 1;       // Count this node.
      count += dfs(n);  // Count this node's children.

      // Alternatively: count += 1 + dfs(n); split up for clarity.
    }
  }
  return count;
}

请注意,您实际上没有检查参数node上的条件,因此如果符合条件,您实际上不会计算您开始的节点;根据您的应用,这可能是必要的,也可能不是必要的。如果你真的想要计算这个节点:

private int dfs(Node node) {
  if (node == null) return 0;

  int count = node.someOtherCondition ? 1 : 0;

  for(Node n: node.children){ 
    count += dfs(n);
  }

  return count;
}

答案 1 :(得分:0)

您应该累积在所有子项上递归调用DFS的结果,而不是在第一个孩子上返回。

答案 2 :(得分:0)

private int dfs(Node node) {
  int count = 0;

  for(Node n: node.children){ 
    if(n != null && n.someOtherCondition){
        // check if the child-node has children
        if(n.children.length > 0){
          count = count + dfs(n); // recursively count the grandchildren aswell
        }
        count = count + 1; // add one because we meet the condition once on this level
    }
  }

  return count;
}

答案 3 :(得分:0)

短而甜蜜:

private int dfs(Node node) {
    int count = node.someOtherCondition ? 1 : 0;
    for (Node child : node.children)
        if (child != null)
            count += dfs(node);
    return count;
}