java递归 json 树_Java阿里面试题,手写算法:递归构建N叉树

ca5cca56ec9ab58d3ce20810ea564743.png

前言

这篇文章承接了之前的文章,都是关于面试的内容。作者是我的一个学弟,目前是大三,所以他的文章偏重于实习/校招。因此有相关经历的小伙伴如果想认识他,可以后台私信我。

这是他的其他一些文章:

面试阿里前,问问自己能不能手写这道题

面试被问到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 + 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值