在Java中搜索树中的节点

时间:2010-11-07 01:57:45

标签: java algorithm recursion tree

我有一个使用以下构造函数构建的二叉树:

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返回。我不确定这是如何工作的,如果有人可以解释,那就太好了。对于某些修复的任何建议?

另外,我被告知我必须首先搜索深度,这意味着首先要深入研究更深层次的世代。我不确定这意味着什么,以及它与我在实现中使用的逻辑有多么不同。

1 个答案:

答案 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