通过树递归计算性别

时间:2010-11-06 23:40:19

标签: 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 (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;
}

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

2 个答案:

答案 0 :(得分:5)

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;
}

您可以将p.countGender(...)视为在其根目录中p的树中为您指定具有指定性别的人数。

这是以下的总和:

  • 1,如果p具有正确的性别
  • p 左侧子树中具有正确性别的人数(如果有)
  • p正确子树中具有正确性别的人数(如果有)。

上面给出的代码执行人员树的depth-first traversal。它实际上是一个预订遍历(处理根节点,然后是左右子树)。也可以进行 inorder 遍历(左子树,然后是节点本身,然后是右子树),或后序遍历(左子树,然后右子树,然后节点本身。)

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

答案 1 :(得分:2)

我认为你加了太多次了。每当孩子跑countGender时,如果是正确的性别(第5行),它会增加1。但是,即使每个孩子检查自己的性别,你也会在第9和第15行再次检查孩子的性别。因此,你要重复计算一切。

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