java - 通过树递归计算性别

标签 java tree

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

public Person(String name, int age, char gender, Person c1, Person c2)

其中 c1 是左 child ,c2 是右 child 。我想编写一个方法来计算匹配给定性别(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 变量,初始化为零。

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

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的性别正确
  • pleft 子树中性别正确的人数(如果有的话)
  • p子树中性别正确的人数(如果有的话)。

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

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

关于java - 通过树递归计算性别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4115757/

相关文章:

java - 如何使两个 Servlet 共享相同的项目列表

java - 编写一个程序来确定一个名字每个字母有多少个

java - HashMap vs. ArrayList 插入性能混淆

java - 创建一个属性,并将名称作为字符串中的值

c++ - 后继AVL树c++

c - ubuntu树命令模拟打开文件过多

java - 获取 "WELD-001408 Unsatisfied dependencies error when deploying a class injected with an interface"

javascript - ivh 树 - 禁用节点选择

css - 我想将 css 添加到我正在读取节点信息的节点

C++ map,找到第一个小于key的元素