Java 递归查询所有下级

背景
在实际开发中,我们常常会遇到树形结构的数据,比如部门组织架构、菜单系统等。在这些场景下,我们可能需要查询某个节点的所有下级节点。递归算法是解决这类问题的有效方法之一。
实现思路
递归算法的核心思想是将一个大问题分解为多个相似的小问题,直到问题规模缩小到可以直接解决。对于查询所有下级节点的问题,我们可以定义一个递归函数,该函数会不断调用自身来查询当前节点的下级节点,直到没有下级节点为止。
代码示例
java
import java.util.ArrayList;
import java.util.List;

// 定义节点类
class Node {
private int id;
private String name;
private List children;

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

public int getId() {
    return id;
}

public String getName() {
    return name;
}

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

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

}

public class RecursiveQuery {
// 递归查询所有下级节点
public static List getAllDescendants(Node node) {
List descendants = new ArrayList<>();
// 遍历当前节点的所有子节点
for (Node child : node.getChildren()) {
descendants.add(child);
// 递归调用,获取子节点的所有下级节点
descendants.addAll(getAllDescendants(child));
}
return descendants;
}

public static void main(String[] args) {
    // 构建树形结构
    Node root = new Node(1, "Root");
    Node child1 = new Node(2, "Child 1");
    Node child2 = new Node(3, "Child 2");
    Node grandChild1 = new Node(4, "GrandChild 1");
    Node grandChild2 = new Node(5, "GrandChild 2");

    root.addChild(child1);
    root.addChild(child2);
    child1.addChild(grandChild1);
    child1.addChild(grandChild2);

    // 查询根节点的所有下级节点
    List<Node> descendants = getAllDescendants(root);

    // 输出结果
    System.out.println("所有下级节点:");
    for (Node node : descendants) {
        System.out.println("ID: " + node.getId() + ", Name: " + node.getName());
    }
}

}
代码解释
Node 类:定义了节点的基本属性,包括节点的 ID、名称和子节点列表。同时提供了添加子节点的方法。
getAllDescendants 方法:这是一个递归函数,用于查询某个节点的所有下级节点。它会遍历当前节点的所有子节点,并将子节点添加到结果列表中。然后递归调用自身,获取子节点的所有下级节点,并将其添加到结果列表中。
main 方法:构建了一个简单的树形结构,并调用 getAllDescendants 方法查询根节点的所有下级节点。最后输出查询结果。
复杂度分析
时间复杂度:
O(n)
,其中
n
是树形结构中节点的总数。因为我们需要遍历每个节点一次。
空间复杂度:
O(h)
,其中
h
是树形结构的高度。递归调用栈的深度取决于树形结构的高度。
通过上述代码和解释,你可以使用递归算法在 Java 中查询某个节点的所有下级节点。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值