java怎么用递归或者其他方式查询三代内的族谱数据

数据结构如下:

public class Person{
    private String id;
    private String gender;
    private String fatherId;
    private String motherId;
}

需求:公母的动物繁殖,需要加一个校验,公和母的三代的族谱不能有交集,所说的三代包含的数据范围如下图,就是以图中的自己为基点,怎么把图中包含的数据都查出来?

img


import java.util.*;

class Person {
    private String id;
    private String gender;
    private String fatherId;
    private String motherId;
    private List<Person> children;

    public Person(String id, String gender, String fatherId, String motherId) {
        this.id = id;
        this.gender = gender;
        this.fatherId = fatherId;
        this.motherId = motherId;
        this.children = new ArrayList<>();
    }

    public String getId() {
        return id;
    }

    public String getGender() {
        return gender;
    }

    public String getFatherId() {
        return fatherId;
    }

    public String getMotherId() {
        return motherId;
    }

    public List<Person> getChildren() {
        return children;
    }

    public void addChild(Person child) {
        children.add(child);
    }
}

class Family {
    private List<Person> members;

    public Family() {
        this.members = new ArrayList<>();
    }

    public void addMember(Person member) {
        members.add(member);
    }

    public List<Person> getMembers() {
        return members;
    }
}

public class ThreeGenerations {
    public static List<Person> findThreeGenerations(Person target, Family family) {
        Set<String> visited = new HashSet<>();
        List<Person> result = new ArrayList<>();
        visited.add(target.getId());
        dfs(target, visited, result, 0, family);
        return result;
    }

    private static void dfs(Person person, Set<String> visited, List<Person> result, int generation, Family family) {
        if (generation == 3) {
            result.add(person);
            return;
        }
        for (Person child : person.getChildren()) {
            if (visited.contains(child.getId())) {
                return;
            }
            visited.add(child.getId());
            dfs(child, visited, result, generation + 1, family);
        }
    }
}

3代族谱,指的是祖先中3代不能有交集,肯定不包括子女
所以往上追溯3代即可
至于其他旁支里面是不是有近亲繁殖的,跟你想要比较的一对没有一毛钱关系,根本就不用管
把所有递归到的数据塞进一个list里,查重