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));
    }
}
posted @ 2025-03-18 12:16  亲爱的阿道君  阅读(19)  评论(0)    收藏  举报