Java树形数据的面试题

作者: 老男孩_Misaya | 来源:发表于2018-09-05 15:48 被阅读11次

    在平时开发、学习、面试中,经常会遇到树形结构数据的地方。比如常见的树形结构的菜单。

    小编最近遇到了一个数据结构的面试的,分享出来大家探讨学习下。

    题目如下:

    是一个典型的无限级的树结构

    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);    }}复制代码

    欢迎多多评论,多多留言,,多多关注,不足地方还请业内高手指点,鸣谢!!!

    相关文章

      网友评论

      本文标题:Java树形数据的面试题

      本文链接:https://www.haomeiwen.com/subject/ynbawftx.html