我有一个带有以下构造函数的Person类:
public Person(String name, int age, char gender, Person c1, Person c2)
Run Code Online (Sandbox Code Playgroud)
其中c1是左子,c2是右子.我想写一个方法来计算与给定性别匹配的人数,M或F:
public int countGender(char gen)
{
int count=0;
if (this.gender==gen){
count++;
}
if (child1!=null){
if (child1.gender==gen){
count+=1+child1.countGender(gen);
}
else count+=child1.countGender(gen);
}
if (child2!=null){
if (child2.gender==gen){
count+=1+child2.countGender(gen);
}
else count+=child2.countGender(gen);
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一切.我很难想象每次函数调用自己时会发生什么.它重置了吗?或者因为我正在使用+ =,它会在重置之前保存自己吗?我的方法还有什么问题?请帮我理解.
每次调用countGender都有自己的count变量,初始化为零.
你需要不需要检查Person两个孩子的性别,因为每个孩子的递归调用可以做到这一点.例如:
public int countGender(char gen) {
int count = 0;
if (this.gender == gen) {
count++;
}
if (child1 != null) {
count += child1.countGender(gen);
}
if (child2 != null) {
count += child2.countGender(gen);
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
您可以p.countGender(...)将具有指定性别的人数视为p在其根目录的树中.
这是以下的总和:
p有正确的性别p(如果有的话)p(如果有的话).上面给出的代码执行人的树的深度优先遍历.它实际上是一个前序遍历(处理根节点,然后是它的左右子树).也可以进行顺序遍历(左子树,然后是节点本身,然后是右子树),或后序遍历(左子树,然后是右子树,然后是节点本身).
对于计数节点,正如您在此处所做的那样,顺序实际上并不重要:结果将是相同的.但是,对于某些操作,例如显示树中的所有人,这很重要.