java 树面试题_Java树形数据的面试题

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

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

题目如下:

81f2860cb162ddf15771b6c0ac5a1195.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

1.解题思路

我的思路是

第一步获取所有数据

26df0ed1188fd90a65aacf199b97fe69.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

第二步遍历得到父节点为0的数据(父层数据)

f26eabe348fb87e9f25aa4a4904f6b1d.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

第三步遍历父层数据得到子层数据

b11ecd4625958b1917b73c0d5efdc821.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

第四步打印父层数据

34aba6dfd23bf7d53c3dcc671c7646e3.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

第五步打印子层数据

9c69eb1c8217470ca669de16fe7b6b12.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

结果如下

f73f3e1b49c26fabedf4a0efcfcd8e42.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

话不多说,以下是代码:

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;

}

}

复制代码

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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;

}

}

复制代码

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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;

}

}

复制代码

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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);

}

}

复制代码

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值