- 树形转为list
- 每个节点对祖级列表的编号List赋值
- list转为树形
实体类结构:
@Data
@NoArgsConstructor
@AllArgsConstructor
class Node {
// id
private Integer id;
// 父id
private Integer pId;
// 名称
private String name;
// 祖级id列表
private List ancestors;
// 子节点
private List children;
public Node(int id, int pId, String name) {
this.id = id;
this.pId = pId;
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"id=" + id +
", pId=" + pId +
", name='" + name + ''' +
", ancestors=" + ancestors +
", children=" + children +
'}';
}
}
树形转为list
@Test
public void test01() {
// 填充数据
Node level4 = new Node(4, 3, "level4-01");
Node level3 = new Node(3, 2, "level3-01");
Node level2 = new Node(2, 1, "level2-01");
Node level22 = new Node(22, 1, "level2-02");
Node level1 = new Node(1, 0, "level1-01");
List level3children = new ArrayList<>();
level3children.add(level4);
level3.setChildren(level3children);
List level2children = new ArrayList<>();
level2children.add(level3);
level2.setChildren(level2children);
List children = new ArrayList<>();
children.add(level2);
children.add(level22);
level1.setChildren(children);
System.out.println(level1.toString());
System.out.println("===============before===============");
// 树形转为list
List result = new ArrayList<>();
this.recursionTreeToList(result, level1, null);
for (Node node : result) {
node.setChildren(null);
System.out.println(node.toString());
}
System.out.println("===============after===============");
}
public void recursionTreeToList(List result, Node root, Node parentNode) {
// 如果没有pid那么就赋值
result.add(root);
if (CollectionUtils.isEmpty(root.getChildren())) {
return;
}
for (Node child : root.getChildren()) {
this.recursionTreeToList(result, child, root);
}
}
结果如下:
@Test
public void test01() {
// 填充数据
Node level4 = new Node(4, 3, "level4-01");
Node level3 = new Node(3, 2, "level3-01");
Node level2 = new Node(2, 1, "level2-01");
Node level22 = new Node(22, 1, "level2-02");
Node level1 = new Node(1, 0, "level1-01");
List level3children = new ArrayList<>();
level3children.add(level4);
level3.setChildren(level3children);
List level2children = new ArrayList<>();
level2children.add(level3);
level2.setChildren(level2children);
List children = new ArrayList<>();
children.add(level2);
children.add(level22);
level1.setChildren(children);
System.out.println(level1.toString());
System.out.println("===============before===============");
// 树形转为list
List result = new ArrayList<>();
this.recursionTreeToList(result, level1, null);
for (Node node : result) {
node.setChildren(null);
System.out.println(node.toString());
}
System.out.println("===============after===============");
// 处理祖父列表
this.handleAncestors(result);
for (Node node : result) {
System.out.println(node.toString());
}
System.out.println("===============handle ancestors after===============");
}
public void recursionTreeToList(List result, Node root, Node parentNode) {
// 如果没有pid那么就赋值
result.add(root);
if (CollectionUtils.isEmpty(root.getChildren())) {
return;
}
for (Node child : root.getChildren()) {
this.recursionTreeToList(result, child, root);
}
}
List ancestors = new ArrayList<>();
public void handleAncestors(List list) {
for (Node node : list) {
ancestors = new ArrayList<>();
List ancestorsList = this.recursionAncestors(list, node);
ancestorsList.add(node.getId());
node.setAncestors(ancestorsList);
}
}
public List recursionAncestors(List list, Node n) {
if (n.getId() == null) {
return ancestors;
}
for (Node node : list) {
if (n.getPId() == node.getId()) {
this.recursionAncestors(list, node);
ancestors.add(node.getId());
}
}
return ancestors;
}
结果如下:
@Test
public void test01() {
// 填充数据
Node level4 = new Node(4, 3, "level4-01");
Node level3 = new Node(3, 2, "level3-01");
Node level2 = new Node(2, 1, "level2-01");
Node level22 = new Node(22, 1, "level2-02");
Node level1 = new Node(1, 0, "level1-01");
List level3children = new ArrayList<>();
level3children.add(level4);
level3.setChildren(level3children);
List level2children = new ArrayList<>();
level2children.add(level3);
level2.setChildren(level2children);
List children = new ArrayList<>();
children.add(level2);
children.add(level22);
level1.setChildren(children);
System.out.println(level1.toString());
System.out.println("=============== before Tree To List ===============");
List result = new ArrayList<>();
// 树形转为list
this.recursionTreeToList(result, level1, null);
for (Node node : result) {
node.setChildren(null);
System.out.println(node.toString());
}
System.out.println("=============== after Tree To List ===============");
// 处理祖父列表
this.handleAncestors(result);
for (Node node : result) {
System.out.println(node.toString());
}
System.out.println("===============handle ancestors after===============");
List nodes = this.recursionListToTree(result, 0);
for (Node node : nodes) {
System.out.println(node.toString());
}
System.out.println("=============== after List To Tree ===============");
}
public void recursionTreeToList(List result, Node root, Node parentNode) {
// 如果没有pid那么就赋值
result.add(root);
if (CollectionUtils.isEmpty(root.getChildren())) {
return;
}
for (Node child : root.getChildren()) {
this.recursionTreeToList(result, child, root);
}
}
public List recursionListToTree(List list, int pId) {
List nodes = new ArrayList<>();
for (Node node : list) {
// 找出父节点
if (pId == node.getPId()) {
// 调用递归方法填充子节点列表
nodes.add(this.findChildren(node, list));
}
}
return nodes;
}
public Node findChildren(Node tree, List treeList) {
for (Node node : treeList) {
if (tree.getId().equals(node.getPId())) {
if (CollectionUtils.isEmpty(tree.getChildren())) {
tree.setChildren(new ArrayList<>());
}
// 递归 调用自身
tree.getChildren().add(this.findChildren(node, treeList));
}
}
return tree;
}
List ancestors = new ArrayList<>();
public void handleAncestors(List list) {
for (Node node : list) {
ancestors = new ArrayList<>();
List ancestorsList = this.recursionAncestors(list, node);
ancestorsList.add(node.getId());
node.setAncestors(ancestorsList);
}
}
public List recursionAncestors(List list, Node n) {
if (n.getId() == null) {
return ancestors;
}
for (Node node : list) {
if (n.getPId() == node.getId()) {
this.recursionAncestors(list, node);
ancestors.add(node.getId());
}
}
return ancestors;
}
结果如图:



