Java 递归父子查询

递归是一种常用的解决问题的方法,它在编程中非常有用。在Java中,递归可以用于各种场景,包括父子查询。父子查询是指在一个数据结构中查找指定节点的所有子节点,或者查找指定节点的所有父节点。

在本文中,我们将介绍如何使用递归来实现Java中的父子查询,并提供一个代码示例。

什么是递归?

递归是一种在函数内部调用自身的编程技巧。它通常用于解决可以被分解为更小的同类问题的问题。递归函数需要满足两个条件:

  • 基本情况:递归函数必须定义一个基本情况,即不再调用自身的情况。这是为了避免函数无限循环调用。
  • 递归调用:递归函数必须调用自身,以解决更小的同类问题。

例如,我们来看一个经典的递归函数,计算一个数字的阶乘:

public int factorial(int n) {
    if (n == 0) { // 基本情况
        return 1;
    } else { // 递归调用
        return n * factorial(n - 1);
    }
}

在上面的代码示例中,factorial函数根据输入的数字n计算它的阶乘。当n等于0时,我们达到了基本情况,返回1。否则,函数会调用自身,传入n-1,并将结果乘以n。

Java 递归父子查询

在Java中,我们可以使用递归来实现父子查询。假设我们有一个树形结构的数据,每个节点包含一个唯一的标识符和一个父节点的引用。我们希望根据给定节点的标识符查找其所有子节点或父节点。

让我们通过以下代码示例来演示如何实现递归父子查询:

import java.util.ArrayList;
import java.util.List;

class Node {
    private int id;
    private Node parent;
    private List<Node> children;

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

    public int getId() {
        return id;
    }

    public void setParent(Node parent) {
        this.parent = parent;
    }

    public Node getParent() {
        return parent;
    }

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

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

    // 递归查询所有子节点
    public List<Node> getAllChildren() {
        List<Node> allChildren = new ArrayList<>();
        for (Node child : children) {
            allChildren.add(child);
            allChildren.addAll(child.getAllChildren());
        }
        return allChildren;
    }

    // 递归查询所有父节点
    public List<Node> getAllParents() {
        List<Node> allParents = new ArrayList<>();
        Node parent = getParent();
        while (parent != null) {
            allParents.add(parent);
            parent = parent.getParent();
        }
        return allParents;
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建一个树形结构的数据
        Node root = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);

        root.addChild(node2);
        root.addChild(node3);
        node2.addChild(node4);
        node2.addChild(node5);
        node3.addChild(node6);

        // 查询节点2的所有子节点
        List<Node> allChildren = node2.getAllChildren();
        System.out.println("节点2的所有子节点:");
        for (Node child : allChildren) {
            System.out.println(child.getId());
        }

        // 查询节点6的所有父节点
        List<Node> allParents = node6.getAllParents();
        System.out.println("节点6的所有父节点:");
        for (Node parent : allParents) {
            System.out.println(parent.getId());
        }
    }
}

在上面的代码示例中,我们定义了一个Node类表示树中的节点。Node类包含