在平时开发、学习、面试中,经常会遇到树形结构数据的地方。比如常见的树形结构的菜单。
小编最近遇到了一个数据结构的面试的,分享出来大家探讨学习下。
题目如下:
是一个典型的无限级的树结构
1.解题思路
我的思路是
第一步获取所有数据
第二步遍历得到父节点为0的数据(父层数据)
第三步遍历父层数据得到子层数据
第四步打印父层数据
第五步打印子层数据
结果如下
话不多说,以下是代码:
1.Emp
packagepojo;/**
* @作者: tjx
* @描述: 员工对象
* @创建时间: 创建于11:30 2018/9/5
**/publicclassEmp{privateInteger ID;privateInteger Parent_ID;privateString Name;publicIntegergetID(){returnID; }publicvoidsetID(Integer ID){this.ID = ID; }publicIntegergetParent_ID(){returnParent_ID; }publicvoidsetParent_ID(Integer parent_ID){ Parent_ID = parent_ID; }publicStringgetName(){returnName; }publicvoidsetName(String name){ Name = name; }}复制代码
2.EmpTree.java
packagepojo;importjava.util.List;/**
* @作者: tjx
* @描述: 树
* @创建时间: 创建于11:34 2018/9/5
**/publicclassEmpTreeextendsEmp{privateList childrens; publicList getChildrens() {returnchildrens; } public void setChildrens(List childrens) {this.childrens = childrens; }}复制代码
3.EmpDAO.java
package dao;import pojo.EmpTree;import java.util.ArrayList;import java.util.List;/**
* @作者: tjx
* @描述: 模拟dao层
* @创建时间: 创建于11:38 2018/9/5
**/publicclassEmpDAO{publicList selectAll(){Listlist=newArrayList(); EmpTree emp =newEmpTree(); emp.setID(1); emp.setParent_ID(0); emp.setName("CEO"); EmpTree emp2 =newEmpTree(); emp2.setID(2); emp2.setParent_ID(1); emp2.setName("CTO"); EmpTree emp3 =newEmpTree(); emp3.setID(3); emp3.setParent_ID(2); emp3.setName("Eng1"); EmpTree emp4 =newEmpTree(); emp4.setID(4); emp4.setParent_ID(5); emp4.setName("Finance1"); EmpTree emp5 =newEmpTree(); emp5.setID(5); emp5.setParent_ID(1); emp5.setName("CFO"); EmpTree emp6 =newEmpTree(); emp6.setID(6); emp6.setParent_ID(5); emp6.setName("Finance2"); EmpTree emp7 =newEmpTree(); emp7.setID(7); emp7.setParent_ID(2); emp7.setName("Eng2"); EmpTree emp8 =newEmpTree(); emp8.setID(8); emp8.setParent_ID(1); emp8.setName("Assistant1"); EmpTree emp9 =newEmpTree(); emp9.setID(9); emp9.setParent_ID(3); emp9.setName("DevSupport1"); EmpTree emp10 =newEmpTree(); emp10.setID(10); emp10.setParent_ID(8); emp10.setName("Intern1");list.add(emp);list.add(emp2);list.add(emp3);list.add(emp4);list.add(emp5);list.add(emp6);list.add(emp7);list.add(emp8);list.add(emp9);list.add(emp10);returnlist; }}复制代码
Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取
架构群;855355016,需要的朋友们欢迎加群
4.TreeUtils.java
package utils;import dao.EmpDAO;import pojo.EmpTree;import java.util.ArrayList;import java.util.List;/**
* @作者: tjx
* @描述: 用于树形结构转换
* @创建时间: 创建于11:45 2018/9/5
**/publicclassTreeUtils{/** 获取 顶级菜单集合 *@paramdata 原始数据 *@parampid 父类编号 *@return*/publicstaticList getParentTree(List data,int pid){if(data ==null) {returnnull; }List empTreeList =newArrayList(); data.forEach(empTree -> {if(pid == empTree.getParent_ID()){ empTreeList.add(empTree); } });returnempTreeList; }/** * 根据 PID 得到出现个数 *@paramdata *@parampid *@return*/publicstaticint getSizeByPid(List data,int pid){return(int) data.stream().filter(empTree -> empTree.getParent_ID() == pid).count(); }/** * 获取 子节点 *@paramdata *@paramparent *@return*/publicstaticListgetChildrens(List data,EmpTreeparent){List result =newArrayList();//找到该菜单下的所有员工data.forEach(empTree -> {if(empTree.getParent_ID() ==parent.getID()){ result.add(empTree); } });//遍历子菜单result.forEach(empTree -> { int count = getSizeByPid(data,parent.getID());if(count>0){//递归调用empTree.setChildrens(getChildrens(data,empTree)); } });returnresult; }/** * 打印子菜单 *@paramdata */publicstaticvoid printChildrens(List data,String oldStr){if(oldStr ==null){ oldStr ="-->"; } String finalOldStr = oldStr; data.forEach(empTree -> { System.out.println(finalOldStr +empTree.getName() );if(empTree.getChildrens()!=null){ printChildrens(empTree.getChildrens(),finalOldStr+"-->"); } }); }/** * 打印父层数据 *@paramdata 原始数据 */publicstaticvoidprint(List data){ data.forEach(empTree -> { System.out.println(empTree.getName());if(empTree.getChildrens()!=null){ printChildrens(empTree.getChildrens(),null); } }); }publicstaticvoid main(String[] args) { EmpDAO empDAO =newEmpDAO();//此处模拟DB操作List rootData = empDAO.selectAll();//获取父类菜单List parentTree = getParentTree(rootData,0);//遍历parentTree.forEach(empTree -> { empTree.setChildrens(getChildrens(rootData,empTree)); });print(parentTree); }}复制代码
欢迎多多评论,多多留言,,多多关注,不足地方还请业内高手指点,鸣谢!!!
网友评论