实现树形结构的高效方法
1.效果图
[
{
"id": 1,
"name": "Root",
"pid": 0,
"code": "ROOT",
"children": [
{
"id": 2,
"name": "Node 1",
"pid": 1,
"code": "N001",
"children": [
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
}
]
},
{
"id": 3,
"name": "Node 2",
"pid": 1,
"code": "N002",
"children": [
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
}
]
},
{
"id": 2,
"name": "Node 1",
"pid": 1,
"code": "N001",
"children": [
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
}
]
},
{
"id": 3,
"name": "Node 2",
"pid": 1,
"code": "N002",
"children": [
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
}
]
},
{
"id": 2,
"name": "Node 1",
"pid": 1,
"code": "N001",
"children": [
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
}
]
},
{
"id": 3,
"name": "Node 2",
"pid": 1,
"code": "N002",
"children": [
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
}
]
},
{
"id": 2,
"name": "Node 1",
"pid": 1,
"code": "N001",
"children": [
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
},
{
"id": 4,
"name": "Node 1.1",
"pid": 2,
"code": "N0011"
}
]
},
{
"id": 3,
"name": "Node 2",
"pid": 1,
"code": "N002",
"children": [
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
},
{
"id": 5,
"name": "Node 2.1",
"pid": 3,
"code": "N0021"
}
]
}
]
}
]
2.算法实现
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNode {
private Long id;
private String name;
private Long pid;
private String code;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TreeNode> children = new ArrayList<>();
public TreeNode(Long id, String name, Long pid, String code) {
this.id = id;
this.name = name;
this.pid = pid;
this.code = code;
}
}
算法:service
public List<TreeNode> getTree() {
List<TreeNode> result = new ArrayList<>();
// 查询数据
List<TreeNode> allTreeNodes = treeNodeRepository.findAll();
// 组装序列
Map<Long,TreeNode> nodeMap = new HashMap<>();
for (TreeNode node : allTreeNodes) {
nodeMap.put(node.getId(), node);
}
// 遍历组装树
for (TreeNode node : allTreeNodes) {
if (node.getPid() == 0) {
// 根节点
result.add(node);
} else {
// 节点挂到父节点上
TreeNode parantNode = nodeMap.get(node.getPid());
if (parantNode != null) {
parantNode.getChildren().add(node);
}
}
}
return result;
}