# tree-3种树形结构设计 **Repository Path**: chengping-for-a-long-time/tree-3-tree-structure-design ## Basic Information - **Project Name**: tree-3种树形结构设计 - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-03 - **Last Updated**: 2021-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tree-3种树形结构设计 ## 介绍 这里包括了三种树形结构的设计遍历代码: 由于建表中存在:一级,二级,三级这种等级身份,其他数据字段都一致 通过使用parentId这个字段来进行等级联系遍历 ### 1.递归 不断的通过查询上一级的id(即是下级的parentId)来将所有的等级相关数据查询而出 即不断的在本方法中调用本方法 容易造成多次查询数据库,每次递归都要对数据库进行查询,次数多了影响效率 ### 2.for循环进行优化 即一次查出所有层级的所有数据 再进行双重for循环,以左右循环数据来存放上下层级数据 `//作为最后的返回结果 List list = new ArrayList<>(); //全量查询所有节点 List supermanList = supermanMapper.selectAll(); for (Superman left : supermanList) { for (Superman right : supermanList) { if (left.getId() == right.getPid()) { left.getChildren().add(right); //这里默认把left设置为父节点 } } //将第一级的数据存入其中,根节点的pid都为0,根节点的id都不相同 if (left.getPid() == 0) { //将父节点是1的根节点存入返回 list.add(left); } } return list;` #### 3.使用map进行配比 将所有节点数据存入map中,id为key,节点数为value,只需一次for循环即可对不同层级进行配比 //定义左侧节点 for (Superman superman : data) { //将所有节点全部存入hashMap中 hashMap.put(superman.getId(),superman); } for (Superman child : data) { if (child.getPid() == 0) { //将根节点存入list数组中 list.add(child); } else { //通过hashMap的索引,找到相应的父节点(相当于不断的往根节点中循环存入child) Superman parent = hashMap.get(child.getPid()); //取出子节点对应的父节点 parent.getChildren().add(child); //父子节点的匹配就完成了 } } return list;