我有一个使用以下构造函数构建的二叉树:
public Person(String name, int age, char gender, Person c1, Person c2)
其中c1是左子,c2是右子。
我想编写一个在最大代中搜索特定名称的方法。就像a.depthFirstSearch(Eva, 1);
一样,Eva是要搜索的名称,1是我可以研究的最大代数(或级别)。
这就是我所拥有的: 编辑:
public Person depthFirstSearch(String name, int maxGeneration)
{
{
Person temp;
if (maxGeneration>1){
if (this.name.equals(name)){
temp=this;
return temp;
}
else{
if (child1!=null)
temp=child1.depthFirstSearch(name, maxGeneration-1);
if (child2!=null)
temp=child1.depthFirstSearch(name, maxGeneration-1);
}
}
return null;
}
}
这里有两个问题。我认为每次函数调用自身时深度都会重置为0,所以我知道我可以跟踪其他地方的深度或找到替代方案。我认为另一个问题是,child2从未真正到达,因为我在child1返回。我不确定这是如何工作的,如果有人可以解释,那就太好了。对于某些修复的任何建议?
另外,我被告知我必须首先搜索深度,这意味着首先要深入研究更深层次的世代。我不确定这意味着什么,以及它与我在实现中使用的逻辑有多么不同。
答案 0 :(得分:2)
由于您在每次递归调用中递减maxGeneration
,因此您根本不需要depth
变量:当maxGeneration == 0
您只是不再搜索并返回{{1}时}}
至于您的其他问题,请将值存储在临时变量中,而不是直接返回null
的值。如果不是child1.depthFirstSearch(...)
,您已找到该节点,请立即将其返回,否则请继续在null
下搜索。
<强>更新强>
它应该是child2
(大于或等于),否则最后一次调用if (maxGeneration >= 1) ...
将始终返回null。或者,您可以检查0并返回null:
maxGeneration == 1
此外,您仍然没有使用返回值来检查节点是否实际在左子树中找到。现在,即使您在if (maxGeneration == 0)
return null;
// rest of your code
下找到该节点,您仍然会在child1
下查看并最终返回null,这是错误的。仅当左侧搜索返回null时,您才需要在child2
下搜索:
child2