叶子节点
java
import java.util.List;
/**
* TODO
*
* @author libinWang
* @className TreeNode
* @date 2025/8/25
*/
public interface TreeNode<K> {
K getId();
K getParentId();
List<? extends TreeNode<K>> getChildren();
void setChildren(List<? extends TreeNode<K>> children);
}
构造器
javascript
import java.util.*;
public class TreeBuilder {
/**
* 通用树形结构构建方法(适用于实现了TreeNode接口的类)
* @param list 原始数据列表
* @param <T> 节点类型
* @param <K> ID类型
* @return 树形结构列表
*/
public static <T extends TreeNode<K>, K> List<T> buildTree(List<T> list) {
if (list == null || list.isEmpty()) {
return Collections.emptyList();
}
Map<K, T> map = new HashMap<>();
for (T item : list) {
map.put(item.getId(), item);
}
List<T> roots = new ArrayList<>();
for (T item : list) {
T parent = map.get(item.getParentId());
if (parent == null) {
roots.add(item);
} else {
List<T> children = (List<T>) parent.getChildren();
if (children == null) {
children = new ArrayList<>();
parent.setChildren(children);
}
children.add(item);
}
}
return roots;
}
}
使用
java
@Data
public class DeptVo implements TreeNode {
/**
* id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 父级ID(指向本表id,根节点为NULL)
*/
private Long parentId;
/**
* 子集
*/
private List<DeptVo> deptVoList;
@Override
public List<? extends TreeNode> getChildren() {
return this.getDeptVoList();
}
@Override
public void setChildren(List children) {
this.setDeptVoList(children);
}
}
java
List<PostVo> copys= TreeBuilder.buildTree(copys);