我有一棵树,其中一些节点具有某种特征。我希望通过使用类似DFS的算法来计算树中具有此特性的节点数量。但是,我错误地使用了返回值。如果找到具有此特性的节点,我希望某种计数器递增,否则计数器不会递增。
这很简单,但我无法正确实现它。
private int dfs(Node node) {
for(Node n: node.children){
if(n != null && n.someOtherCondition){
return 1 + dfs(n);
}
}
return 0;
}
答案 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;
}