在平时开发、学习、面试中,常常会遇到树形结构数据的地方。好比常见的树形结构的菜单。java
博主最近遇到了一个数据结构的面试的,分享出来你们探讨学习下。面试
题目以下:bash
是一个典型的无限级的树结构数据结构
1.解题思路学习
个人思路是ui
第一步获取全部数据this
第二步遍历获得父节点为0的数据(父层数据)spa
第三步遍历父层数据获得子层数据3d
第四步打印父层数据code
第五步打印子层数据
结果以下
话很少说,如下是代码:
1.Emp
package pojo;
/**
* @做者: tjx
* @描述: 员工对象
* @建立时间: 建立于11:30 2018/9/5
**/
public class Emp {
private Integer ID;
private Integer Parent_ID;
private String Name;
public Integer getID() {
return ID;
}
public void setID(Integer ID) {
this.ID = ID;
}
public Integer getParent_ID() {
return Parent_ID;
}
public void setParent_ID(Integer parent_ID) {
Parent_ID = parent_ID;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
复制代码
2.EmpTree.java
package pojo;
import java.util.List;
/**
* @做者: tjx
* @描述: 树
* @建立时间: 建立于11:34 2018/9/5
**/
public class EmpTree extends Emp{
private List childrens;
public List getChildrens() {
return childrens;
}
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
**/
public class EmpDAO {
public List selectAll(){
List list = new ArrayList();
EmpTree emp = new EmpTree();
emp.setID(1);
emp.setParent_ID(0);
emp.setName("CEO");
EmpTree emp2 = new EmpTree();
emp2.setID(2);
emp2.setParent_ID(1);
emp2.setName("CTO");
EmpTree emp3 = new EmpTree();
emp3.setID(3);
emp3.setParent_ID(2);
emp3.setName("Eng1");
EmpTree emp4 = new EmpTree();
emp4.setID(4);
emp4.setParent_ID(5);
emp4.setName("Finance1");
EmpTree emp5 = new EmpTree();
emp5.setID(5);
emp5.setParent_ID(1);
emp5.setName("CFO");
EmpTree emp6 = new EmpTree();
emp6.setID(6);
emp6.setParent_ID(5);
emp6.setName("Finance2");
EmpTree emp7 = new EmpTree();
emp7.setID(7);
emp7.setParent_ID(2);
emp7.setName("Eng2");
EmpTree emp8 = new EmpTree();
emp8.setID(8);
emp8.setParent_ID(1);
emp8.setName("Assistant1");
EmpTree emp9 = new EmpTree();
emp9.setID(9);
emp9.setParent_ID(3);
emp9.setName("DevSupport1");
EmpTree emp10 = new EmpTree();
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);
return list;
}
}
复制代码
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
**/
public class TreeUtils {
/** 获取 顶级菜单集合
* @param data 原始数据
* @param pid 父类编号
* @return
*/
public static List getParentTree(List data,int pid){
if (data == null) {
return null;
}
List empTreeList = new ArrayList();
data.forEach(empTree -> {
if(pid == empTree.getParent_ID()){
empTreeList.add(empTree);
}
});
return empTreeList;
}
/**
* 根据 PID 获得出现个数
* @param data
* @param pid
* @return
*/
public static int getSizeByPid(List data,int pid){
return (int) data.stream().filter(empTree -> empTree.getParent_ID() == pid).count();
}
/**
* 获取 子节点
* @param data
* @param parent
* @return
*/
public static List getChildrens(List data,EmpTree parent){
List result = new ArrayList();
//找到该菜单下的全部员工
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));
}
});
return result;
}
/**
* 打印子菜单
* @param data
*/
public static void 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+"-->");
}
});
}
/**
* 打印父层数据
* @param data 原始数据
*/
public static void print(List data){
data.forEach(empTree -> {
System.out.println(empTree.getName());
if(empTree.getChildrens()!=null){
printChildrens(empTree.getChildrens(),null);
}
});
}
public static void main(String[] args) {
EmpDAO empDAO = new EmpDAO();
//此处模拟DB操做
List rootData = empDAO.selectAll();
//获取父类菜单
List parentTree = getParentTree(rootData, 0);
//遍历
parentTree.forEach(empTree -> {
empTree.setChildrens(getChildrens(rootData,empTree));
});
print(parentTree);
}
}
复制代码
欢迎多多评论,多多留言,不足地方还请业内高手指点,鸣谢!!!