用java写一段通过多个类的list来生成一棵树,其中类的某个属性为pid,指的是父节点的id
时间: 2024-02-27 08:54:55 浏览: 78
好的,下面是一段通过多个类的List来生成一棵树,其中类的某个属性为pid,指的是父节点的id的Java代码:
```java
import java.util.*;
public class TreeBuilder {
public static class TreeNode {
public int id;
public List<TreeNode> children;
public TreeNode(int id) {
this.id = id;
this.children = new ArrayList<>();
}
}
public static <T extends TreeNodeInterface> TreeNode buildTree(List<T> nodes) {
Map<Integer, TreeNode> map = new HashMap<>();
// 创建所有节点
for (T node : nodes) {
TreeNode treeNode = new TreeNode(node.getId());
map.put(node.getId(), treeNode);
}
// 添加所有子节点
for (T node : nodes) {
TreeNode parent = map.get(node.getPid());
if (parent != null) {
TreeNode child = map.get(node.getId());
parent.children.add(child);
}
}
// 返回根节点
for (TreeNode node : map.values()) {
if (node.id != 0 && node.children.size() == 0) {
TreeNode parent = map.get(0);
parent.children.add(node);
}
}
return map.get(0);
}
public static void main(String[] args) {
List<Category> categories = new ArrayList<>();
categories.add(new Category(1, 0, "电脑"));
categories.add(new Category(2, 1, "笔记本"));
categories.add(new Category(3, 1, "台式机"));
categories.add(new Category(4, 2, "联想"));
categories.add(new Category(5, 2, "戴尔"));
categories.add(new Category(6, 3, "惠普"));
categories.add(new Category(7, 0, "手机"));
categories.add(new Category(8, 7, "苹果"));
categories.add(new Category(9, 7, "华为"));
TreeNode root = buildTree(categories);
System.out.println(root.id);
}
}
interface TreeNodeInterface {
int getId();
int getPid();
}
class Category implements TreeNodeInterface {
private int id;
private int pid;
private String name;
public Category(int id, int pid, String name) {
this.id = id;
this.pid = pid;
this.name = name;
}
public int getId() {
return id;
}
public int getPid() {
return pid;
}
public String getName() {
return name;
}
}
```
这段代码中,我们定义了一个 `TreeNode` 类来表示树的节点,其中 `id` 保存节点的id,`children` 保存所有子节点。`TreeNodeInterface` 是一个接口,代表了树节点的属性,包括id和pid。 `buildTree` 方法接受一个参数,即所有节点的列表 `nodes`,其中每个节点都实现了 `TreeNodeInterface` 接口。我们先创建所有节点,然后再为每个节点添加子节点。最后返回根节点即可。在 `main` 方法中,我们演示了如何使用这个方法来创建一棵树,根节点的id为 0。
这段代码的时间复杂度为 $O(n)$,其中 $n$ 是节点的数量。
阅读全文