Javaツリーデータの面接問題

8292 ワード

普段開発、学習、面接では、ツリー構造データの場所に遭遇することがよくあります.たとえば、一般的なツリー構造のメニューです.
ブロガーは最近、データ構造の面接に出会った.
タイトルは以下の通りです.

典型的な無限レベルのツリー構造です
1.解題の考え方
私の考えは
最初のステップですべてのデータを取得

2番目のステップでは、親ノードが0のデータ(親データ)を巡回します.

第3のステップでは、親データを巡回してサブレイヤデータを取得します.

ステップ4親データの印刷

ステップ5サブレイヤデータの印刷

結果は次のとおりです.

あまり話さないで、以下はコードです.
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);


    }

}

多くのコメントを歓迎して、多くの伝言を残して、足りない地方はまた业界の达人に指导してもらって、お礼を言います!!!