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
类包含