Tree树形结构
package util;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
public class TreeBuilder {
public static class Element {
private Integer id;
private String name;
private Integer parentId;
public Element(Integer id, String name, Integer parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
public Integer getId() {
return id;
}
public Integer getParentId() {
return parentId;
}
public String getName() {
return name;
}
}
@Data
public static class TreeNode {
private Integer id;
private String name;
private Integer parentId;
private List<TreeNode> children = new ArrayList<>();
private Boolean isLeaf;
private int level;
}
public List<TreeNode> buildTree(List<Element> elements) {
Map<Integer, TreeNode> nodeMap = new HashMap<>();
// 步骤1:转换元素为树节点并存入Map
for (Element e : elements) {
TreeNode node = new TreeNode();
node.setId(e.getId());
node.setName(e.getName());
node.setParentId(e.getParentId());
node.setChildren(new ArrayList<>());
nodeMap.put(node.getId(), node);
}
List<TreeNode> rootNodes = new ArrayList<>();
// 步骤2:建立父子关系
for (TreeNode node : nodeMap.values()) {
Integer parentId = node.getParentId();
if (parentId != null && nodeMap.containsKey(parentId)) {
TreeNode parentNode = nodeMap.get(parentId);
parentNode.getChildren().add(node);
} else {
rootNodes.add(node);
}
}
// 步骤3:使用BFS设置层级
Queue<TreeNode> queue = new LinkedList<>();
for (TreeNode root : rootNodes) {
root.setLevel(1);
queue.offer(root);
}
while (!queue.isEmpty()) {
TreeNode current = queue.poll();
for (TreeNode child : current.getChildren()) {
child.setLevel(current.getLevel() + 1);
queue.offer(child);
}
}
// 步骤4:设置是否为叶子节点
for (TreeNode node : nodeMap.values()) {
node.setIsLeaf(node.getChildren().isEmpty());
}
return rootNodes;
}
// 示例用法
public static void main(String[] args) {
List<Element> elements = new ArrayList<>();
elements.add(new Element(1, "节点1", null));
elements.add(new Element(2, "节点1-1", 1));
elements.add(new Element(3, "节点2", null));
elements.add(new Element(4, "节点2-1", 3));
elements.add(new Element(5, "节点2-2", 3));
elements.add(new Element(6, "节点2-2-1", 5));
TreeBuilder builder = new TreeBuilder();
List<TreeNode> tree = builder.buildTree(elements);
// 输出示例结构,此处可转换为JSON
System.out.println(JSON.toJSONString(tree));
}
}
不积跬步,无以至千里;不积小流,无以成江海。