使用 Java 实现上下级多级的全部上下级查询

引言

在实际的软件开发过程中,我们经常需要处理具有层级关系的数据结构,例如组织架构、分类结构等。在这些数据结构中,我们常常需要查询某个节点的所有上级或下级节点。本文将介绍使用 Java 实现上下级多级的全部上下级查询的方法,并给出相应的代码示例。

背景

在组织架构或分类结构中,每个节点通常包含一个唯一的标识符和一个指向父节点的引用。通过这些信息,我们可以构建一个树形结构来表示整个层级关系。例如,在一个公司的组织架构中,每个员工都有一个唯一的员工编号,并且可能有一个直属上级。通过这些信息,我们可以构建一个以公司最高领导人为根节点的树形结构,每个节点表示一个员工。

实现思路

要实现上下级多级的全部上下级查询,我们可以使用递归算法来遍历整个树形结构。具体来说,我们可以从根节点开始,依次遍历每个节点,然后递归地查询该节点的所有下级节点或上级节点。

为了方便演示,我们将使用一个简化的员工类 Employee 来表示每个节点。该类包含一个唯一的员工编号和一个指向上级节点的引用。以下是该类的定义:

class Employee {
    private int id;
    private Employee parent;

    // 构造方法和其他属性的定义省略
}

查询下级节点

要查询某个节点的所有下级节点,我们可以使用深度优先遍历的方法。具体来说,我们可以从该节点开始,递归地遍历其所有直接下级节点,然后递归地遍历下级节点的下级节点,以此类推。

以下是查询下级节点的实现示例:

class Employee {
    // 省略其他属性和方法

    public List<Employee> getAllSubordinates() {
        List<Employee> subordinates = new ArrayList<>();
        getAllSubordinatesRecursive(this, subordinates);
        return subordinates;
    }

    private void getAllSubordinatesRecursive(Employee employee, List<Employee> subordinates) {
        for (Employee subordinate : employee.getDirectSubordinates()) {
            subordinates.add(subordinate);
            getAllSubordinatesRecursive(subordinate, subordinates);
        }
    }
}

在上述代码中,getAllSubordinates 方法返回一个包含所有下级节点的列表。它首先创建一个空的列表 subordinates,然后调用 getAllSubordinatesRecursive 方法来递归地获取所有下级节点。

getAllSubordinatesRecursive 方法接受两个参数:当前节点 employee 和用于保存下级节点的列表 subordinates。它首先遍历当前节点的所有直接下级节点,并将它们添加到 subordinates 列表中。然后,对每个下级节点递归调用 getAllSubordinatesRecursive 方法,以获取其所有下级节点。

查询上级节点

要查询某个节点的所有上级节点,我们可以从该节点开始,依次遍历其父节点的父节点,直到遍历到根节点为止。这样,我们就可以获取该节点的所有上级节点。

以下是查询上级节点的实现示例:

class Employee {
    // 省略其他属性和方法

    public List<Employee> getAllSuperiors() {
        List<Employee> superiors = new ArrayList<>();
        getAllSuperiorsRecursive(this, superiors);
        return superiors;
    }

    private void getAllSuperiorsRecursive(Employee employee, List<Employee> superiors) {
        Employee parent = employee.getParent();
        if (parent != null) {
            superiors.add(parent);
            getAllSuperiorsRecursive(parent, superiors);
        }
    }
}

在上述代码中,getAllSuperiors 方法返回一个包含所有上级节点的列表。它首先创建一个空的列表 superiors,然后调用 getAllSuperiorsRecursive 方法来递归地获取所有上级节点。

getAllSuperiorsRecursive 方法接受两个参数:当前节点 employee 和用于保存上级节点的列表 superiors。它首先获取当前节点的