Java樹形數據的面試題

在平時開發、學習、面試中,常常會遇到樹形結構數據的地方。好比常見的樹形結構的菜單。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<EmpTree> childrens;

    public List<EmpTree> getChildrens() {
        return childrens;
    }

    public void setChildrens(List<EmpTree> 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<EmpTree> selectAll(){
        List<EmpTree> list = new ArrayList<EmpTree>();
        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<EmpTree> getParentTree(List<EmpTree> data,int pid){
        if (data == null) {
            return null;
        }
        List<EmpTree> empTreeList = new ArrayList<EmpTree>();
       data.forEach(empTree -> {
            if(pid == empTree.getParent_ID()){
                empTreeList.add(empTree);
            }
       });
       return empTreeList;
    }

    /**
     * 根據 PID  獲得出現個數
     * @param data
     * @param pid
     * @return
     */
    public static int getSizeByPid(List<EmpTree> data,int pid){
        return (int) data.stream().filter(empTree -> empTree.getParent_ID() == pid).count();
    }

    /**
     * 獲取 子節點
     * @param data
     * @param parent
     * @return
     */
    public static List getChildrens(List<EmpTree> data,EmpTree parent){
        List<EmpTree> result = new ArrayList<EmpTree>();
        //找到該菜單下的全部員工
        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<EmpTree> 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<EmpTree> 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<EmpTree> rootData = empDAO.selectAll();

        //獲取父類菜單
        List<EmpTree> parentTree = getParentTree(rootData, 0);

        //遍歷
        parentTree.forEach(empTree -> {
            empTree.setChildrens(getChildrens(rootData,empTree));
        });

        print(parentTree);


    }

}
複製代碼

歡迎多多評論,多多留言,不足地方還請業內高手指點,鳴謝!!!

相關文章
相關標籤/搜索