Java 通过树递归计算性别

Java 通过树递归计算性别,java,tree,Java,Tree,我有一个具有以下构造函数的Person类: public Person(String name, int age, char gender, Person c1, Person c2) 其中c1为左子级,c2为右子级。我想写一个方法,计算与给定性别匹配的人数,M或F: public int countGender(char gen) { int count=0; if (this.gender==gen){ count++; } if (chil

我有一个具有以下构造函数的Person类:

public Person(String name, int age, char gender, Person c1, Person c2)
其中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;
}

我什么都试过了。我很难想象每次函数调用自己时计数会发生什么。它重置了吗?或者因为我使用+=,它会在重置之前保存自己吗?我的方法还有什么问题?请帮助我理解。

每次调用
countGender
都有自己的
count
变量,初始化为零

您不需要检查一个人的两个孩子的性别,因为对每个孩子的递归调用都可以做到这一点。例如:

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;
}
您可以将
p.countGender(…)
视为在根目录下有
p
的树中提供指定性别的人数

这是以下各项的总和:

  • 1,如果
    p
    的性别正确
  • p
    子树中具有正确性别的人数(如果有)
  • p
    右侧子树中具有正确性别的人数(如果有)
上面给出的代码执行了一个人物树的分析。它实际上是一个前序遍历(处理根节点,后跟其左、右子树)。也可以执行顺序遍历(左子树,然后是节点本身,然后是右子树),或后序遍历(左子树,然后是右子树,然后是节点本身)


对于计算节点,正如您在这里所做的,顺序实际上并不重要:结果将是相同的。但是,对于某些操作,例如显示树中的所有人,这确实很重要。

我认为您添加1的次数太多了。每次孩子运行
countGender
,如果是正确的性别,它会在计数上加1(第5行)。但是,您在第9行和第15行再次检查孩子的性别,即使每个孩子检查自己的性别。因此,你在重复计算每件事


至于递归,
countGender
的每个调用都是不同的,与任何其他调用都是独立的。每个实例的
count
在内存中是一个单独的变量,每次都初始化为0。

再次,请用这些类型的问题发布输入、预期输出和实际输出。另外,告诉我们你是如何测试的,你观察到了什么?可能是重复的哇,这很简单,嗯..我应该考虑一下。我是新来的递归仍然在努力学习技巧…谢谢!