Java 如何快速找到下级

引言

在开发过程中,经常会遇到需要查找某个对象的下级对象的需求。例如,在一个组织架构中,需要查找某个部门的所有下级部门。本文将介绍一种基于树结构的快速查找下级对象的方案。

问题描述

假设有一个组织架构树,每个节点表示一个部门,节点之间通过父子关系相连。现在需要实现一个功能,根据给定的部门ID,快速找到该部门的所有下级部门。

方案设计

为了实现快速查找下级对象,我们可以采用以下方案:

  1. 使用树结构存储部门之间的父子关系;
  2. 为树节点定义一个children属性,用于保存该节点的所有子节点;
  3. 采用深度优先搜索算法(DFS)遍历树结构,找到给定部门ID的节点,并返回其所有子节点。

为了更好地理解组织架构树的结构,下面是一个类图,描述了树节点的定义:

classDiagram
    class Department {
        -id: String
        -name: String
        -parent: Department
        -children: List<Department>
        +Department(id: String, name: String)
        +getId(): String
        +getName(): String
        +getParent(): Department
        +getChildren(): List<Department>
        +addChild(child: Department): void
    }

代码实现

下面是使用Java代码实现的树节点类Department

public class Department {
    private String id;
    private String name;
    private Department parent;
    private List<Department> children;

    public Department(String id, String name) {
        this.id = id;
        this.name = name;
        this.children = new ArrayList<>();
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Department getParent() {
        return parent;
    }

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

    public void addChild(Department child) {
        child.parent = this;
        children.add(child);
    }
}

下面是根据给定部门ID查找下级部门的方法findChildren的实现:

public List<Department> findChildren(Department root, String departmentId) {
    List<Department> result = new ArrayList<>();
    Stack<Department> stack = new Stack<>();
    stack.push(root);

    while (!stack.isEmpty()) {
        Department node = stack.pop();
        if (node.getId().equals(departmentId)) {
            result.addAll(node.getChildren());
            break;
        }
        for (Department child : node.getChildren()) {
            stack.push(child);
        }
    }

    return result;
}

测试示例

为了验证上述方案的正确性,我们可以创建一颗组织架构树,并使用findChildren方法来查找指定部门的下级部门。下面是一个测试示例:

public class OrganizationTreeExample {
    public static void main(String[] args) {
        // 创建部门
        Department root = new Department("0", "根部门");
        Department departmentA = new Department("A", "部门A");
        Department departmentA1 = new Department("A1", "部门A1");
        Department departmentA2 = new Department("A2", "部门A2");
        Department departmentB = new Department("B", "部门B");
        Department departmentB1 = new Department("B1", "部门B1");
        Department departmentB2 = new Department("B2", "部门B2");

        // 构建组织架构树
        root.addChild(departmentA);
        departmentA.addChild(departmentA1);
        departmentA.addChild(departmentA2);
        root.addChild(departmentB);
        departmentB.addChild(departmentB1);
        departmentB.addChild(departmentB2);

        // 查找部门A的下级部门
        List<Department> childrenOfA = findChildren(root, "A");