| import lombok.Getter; |
| import lombok.Setter; |
| |
| import java.util.List; |
| |
| |
| |
| |
| @Setter |
| @Getter |
| public class TreeNode { |
| |
| |
| private Integer id; |
| |
| |
| private Integer parentId; |
| |
| |
| private String label; |
| |
| |
| private List<TreeNode> children; |
| |
| public TreeNode(Integer id, Integer parentId, String label) { |
| this.id = id; |
| this.parentId = parentId; |
| this.label = label; |
| } |
| } |
理解思路(个人):
1、首先获取所有的根节点(顶级节点),即根节点的 parentId = 0。
2、根据每一个根节点,与所有节点集合(数据)进行判断,当前节点是否为其下的子节点。
3、若是,则递归调用构建树形;若不是,则表明该节点不属于其下子节点。
4、应继续循环判断节点父子关系,直到所有节点与根节点判断完毕。
| import java.util.ArrayList; |
| import java.util.List; |
| |
| |
| |
| |
| public class TreeBuild { |
| |
| |
| public List<TreeNode> nodeList = new ArrayList<>(); |
| |
| |
| |
| |
| |
| public TreeBuild(List<TreeNode> nodeList){ |
| this.nodeList = nodeList; |
| } |
| |
| |
| |
| |
| |
| public List<TreeNode> getRootNode(){ |
| |
| List<TreeNode> rootNodeList = new ArrayList<>(); |
| |
| for (TreeNode treeNode : nodeList){ |
| |
| if (0 == treeNode.getParentId()) { |
| |
| rootNodeList.add(treeNode); |
| } |
| } |
| return rootNodeList; |
| } |
| |
| |
| |
| |
| |
| public List<TreeNode> buildTree(){ |
| |
| List<TreeNode> treeNodes = new ArrayList<TreeNode>(); |
| |
| for (TreeNode treeRootNode : getRootNode()) { |
| |
| treeRootNode = buildChildTree(treeRootNode); |
| |
| treeNodes.add(treeRootNode); |
| } |
| return treeNodes; |
| } |
| |
| |
| |
| |
| |
| |
| public TreeNode buildChildTree(TreeNode pNode){ |
| List<TreeNode> childTree = new ArrayList<TreeNode>(); |
| |
| for (TreeNode treeNode : nodeList) { |
| |
| if (treeNode.getParentId().equals(pNode.getId())) { |
| |
| childTree.add(buildChildTree(treeNode)); |
| } |
| } |
| |
| pNode.setChildren(childTree); |
| return pNode; |
| } |
| |
| } |
| import com.lbf.common.core.domain.AjaxResult; |
| import org.springframework.web.bind.annotation.GetMapping; |
| import org.springframework.web.bind.annotation.RequestMapping; |
| import org.springframework.web.bind.annotation.RestController; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| |
| |
| |
| |
| @RestController |
| @RequestMapping("/tree") |
| public class TreeController { |
| |
| @GetMapping("/treeTest") |
| public AjaxResult treeTest(){ |
| |
| |
| List<TreeNode> treeNodeList = new ArrayList<>(); |
| treeNodeList.add(new TreeNode(1,0,"顶级节点A")); |
| treeNodeList.add(new TreeNode(2,0,"顶级节点B")); |
| treeNodeList.add(new TreeNode(3,1,"父节点是A")); |
| treeNodeList.add(new TreeNode(4,2,"父节点是B")); |
| treeNodeList.add(new TreeNode(5,2,"父节点是B")); |
| treeNodeList.add(new TreeNode(6,3,"父节点的ID是3")); |
| |
| |
| TreeBuild treeBuild = new TreeBuild(treeNodeList); |
| |
| treeNodeList = treeBuild.buildTree(); |
| |
| return AjaxResult.success("测试数据",treeNodeList); |
| } |
| } |