![ca5cca56ec9ab58d3ce20810ea564743.png](https://i-blog.csdnimg.cn/blog_migrate/94c33e7f1c1755857ec931ab54493bb2.jpeg)
前言
这篇文章承接了之前的文章,都是关于面试的内容。作者是我的一个学弟,目前是大三,所以他的文章偏重于实习/校招。因此有相关经历的小伙伴如果想认识他,可以后台私信我。
这是他的其他一些文章:
面试阿里前,问问自己能不能手写这道题
面试被问到Spring IOC、AOP和动态代理,用这篇文章怼过去
面试被问到Java虚拟机,用这篇文章怼过去
正文
题目要求:
现在我们拥有全国的省、市、县、镇的行政信息,比如 浙江省 -> 杭州市 -> 西湖区 --> xx街道,请将这些信息构建成一棵树,根节点为全国,叶子节点为镇。
我的误解:
刚开始我并没有明白题意,走了弯路,只是简单的构建了一个多叉树。代码如下:
import java.util.ArrayList;import java.util.List;public class SiteTree { public final static String COUNTRY = "国"; public final static String PROVINCE = "省"; public final static String CITY = "市"; private static class Node { private String level; //国》省》市》县》镇 private String name; //例如:山东省、济南市等具体地名 private List child; //下一级节点列表 private Node(String level, String name) { this.level = level; this.name = name; } //Getter Setter } public static void main(String[] args) { //声明一个根节点 Node GUO = new Node(SiteTree.COUNTRY, "中国"); //山东省下的市级单位 Node JINAN = new Node(SiteTree.CITY, "济南市"); Node JINING = new Node(SiteTree.CITY, "济宁市"); //将市级节点放入山东省级节点下 Node QLU = new Node(SiteTree.PROVINCE, "山东省"); SiteTree.add(QLU, JINAN, JINING); //将省级节点放入国级节点下 Node ZJS = new Node(SiteTree.PROVINCE, "浙江省"); SiteTree.add(GUO, QLU, ZJS); //不再举例... System.out.println(GUO); } public static void add(Node parent, Node... child) { List childs = new ArrayList<>(); for (int i = 0; i < child.length; i++) { childs.add(child[i]); } parent.setChild(childs); }}
当面试官看到代码后,提示我:你需要实现一个通用的方法。我没太明白,面试官又说:主要考察你对递归的使用。
看到这里,我忽然明白了面试官的意图:使用递归去构建N叉树。
摆在我面前的一个问题是,我该如何去读取数据源,数据源储存的形式是什么?是文本文件还是数据库?
文本文件说实话,不太好实现,而且不规范,正常逻辑数据应该储存在数据库。
但是我现在总不能去装个数据库吧?再写DAO层查询接口?这不现实。
没办法,只能自己简单模拟下数据库操作了!
表结构都是一行一行的数据,那就用List。每行数据(节点)不能只有主键,还要有父节点的外键,因为题目要求也给出了数据是具有指向关系的 。
如何实现数据的查询呢?当然是用Stream,最简单。
分析到这里,完整的代码已经呼之欲出,请看大屏幕 ↘
import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;public class SiteTree { public final static String COUNTRY = "国"; public final static String PROVINCE = "省"; public final static String CITY = "市"; private static List list = initData(); //结合数据库比较好实现,所以简单实现下! private static class Node{ private int cid; //节点ID private int pid; //父节点ID private String level; //国》省》市》县》镇 private String name; //例如:山东省、济南市等具体地名 private List child = new ArrayList<>(); //下一级节点列表 public Node(int cid, int pid, String level, String name) { this.cid = cid; this.pid = pid; this.level = level; this.name = name; } public int getCid() { return cid; } public int getPid() { return pid; } public String getName() { return name; } public List getChild() { return child; } @Override public String toString() { return "Node{" + "cid=" + cid +