public static List<Node> buildTree(List<Node> nodes) {
Map<Integer, List<Node>> map = new HashMap<>();
for (Node node : nodes) {
if (!map.containsKey(node.getPid())) {
map.put(node.getPid(), new ArrayList<>());
}
map.get(node.getPid()).add(node);
}
return buildTree(map, 0);
}
private static List<Node> buildTree(Map<Integer, List<Node>> map, int parentId) {
List<Node> tree = new ArrayList<>();
if (map.containsKey(parentId)) {
for (Node node : map.get(parentId)) {
node.setChildren(buildTree(map, node.getId()));
tree.add(node);
}
}
return tree;
}
在该递归函数中,我们首先创建一个Map,用于将父节点ID映射到其子节点。然后,我们传递给buildTree方法一个Map和一个父ID,它将返回一个节点列表,该列表包含具有父ID的所有子节点。如果一个节点没有子节点,则其子节点列表为空。
要将ID,PID格式与此递归函数一起使用,您只需将Node类定义为具有ID和PID字段的类,并将其节点对象添加到节点列表中,如下所示:
public class Node {
private int id;
private int pid;
private String name;
private List<Node> children;
// 构造函数、getter、setter等方法略
public static void main(String[] args) {
List<Node> nodes = new ArrayList<>();
nodes.add(new Node(1, 0, "root"));
nodes.add(new Node(2, 1, "child1"));
nodes.add(new Node(3, 1, "child2"));
nodes.add(new Node(4, 2, "grandchild1"));
nodes.add(new Node(5, 2, "grandchild2"));
nodes.add(new Node(6, 3, "grandchild3"));
List<Node> tree = buildTree(nodes);
// 对树进行操作或打印
}
}