面试题:给你个id,去拿到name,多叉树遍历
前天面试遇到一个多叉树面试的题目,在这里分享记录一下。
题目:一个树形的数据(如下数据),面试官给你一个
id,然后拿到对应的name?
数据结构大概是这个样子
var cityData = [
{
id: 1,
name: '广东省',
children: [
{
id: 11,
name: '深圳',
children: [
{
id: 111,
name: '宝安',
children: [
{
id: 1111,
name: '西乡',
children:[
{
id: 11111,
name: '坪洲',
children:[]
},
{
id: 11112,
name: '灵芝',
children:[]
}
]
},
{
id: 1112,
name: '南山',
children:[
{
id: 11121,
name: '科技园',
children:[]
}
]
}
]
},
{
id: 112,
name: '福田',
children: []
}
]
},
{
id: 12,
name: '广州',
children: [
{
id: 122,
name: '白云区',
children: [
{
id: 1222,
name: '白云区',
children: []
}
]
},
{
id: 122,
name: '珠海区',
children: []
}
]
}
]
},
{
id: 2,
name: '湖南省',
children: []
}
];
比如说 我要id是11112的name返回是灵芝,请问你有几种解法??
递归方法
这题目让人看到这不就是考用递归的方法嘛,代码如下
let result = ''
// 递归实现
const recursion = (cityData, id) => {
// cityData数据为空的时候直接返回
if (!cityData || !cityData.length) return;
// 常规循环cityData
for (let i = 0, len = cityData.length; i < len; i++) {
const childs = cityData[i].children;
// 如果匹配到id的话,就是我们要的结果
if (cityData[i].id === id) {
result = cityData[i].name
}
// 如果还有子节点,执行递归
if(childs && childs.length > 0){
recursion(childs, id);
}
}
return result
};
const r = recursion(cityData, 11112);
console.log(r) // 灵芝
oyes~~~完成了么??面试官可能不满意哦,下面还有几种解法
广度优先实现
let result = ''
const range = (cityData, id) => {
if (!cityData || !cityData.length) return;
// 定义一个数据栈
let stack = [];
let item = null;
//先将第一层节点放入栈
for (var i = 0, len = cityData.length; i < len; i++) {
stack.push(cityData[i]);
}
while (stack.length) {
// 将数据栈的第一个取出来
item = stack.shift();
// 如果符合就赋值给result
if (item.id === id) {
result = item.name
}
//如果该节点有子节点,继续添加进入栈底
if (item.children && item.children.length) {
stack = stack.concat(item.children);
}
}
return result
};
let r1 = range(cityData, 11112);
console.log(r1) // 灵芝
深度优先实现
let result = ''
const deep = (cityData, id) => {
// 没有数据直接返回
if (!cityData || !cityData.length) return;
// 先定义一个数据栈
let stack = []
let item = null
//先将第一层节点放入数据栈
for (var i = 0, len = cityData.length; i < len; i++) {
stack.push(cityData[i])
}
// 循环
while (stack.length) {
item = stack.shift()
if (item.id === id) {
result = item.name
}
//如果该节点有子节点,继续添加进入栈顶
if (item.children && item.children.length) {
// 注意这里调换了顺序
stack = item.children.concat(stack);
}
}
return result
};
let r3 = deep(cityData, 11112)
console.log(r3) // 灵芝
正则方式实现
const regular = (cityData, id) => {
// 没有数据直接返回
if (!cityData || !cityData.length) return;
// 数据转成字符串
let cityStr = JSON.stringify(cityData)
// 定义正则
let reg = new RegExp(`"id":${id},"name":"([^\\x00-\\xff]+)",`)
// 取到正则的子字符串并返回
return (cityStr.match(reg))[1]
}
let r4 = regular(cityData, 11112);
console.log(r4) // 灵芝
这里列举了4种方法,应该还有很多种方法,大佬们有的话可以留言给我,先谢谢啦~~
本文转载于:猿2048面试题:给你个id,去拿到name,多叉树遍历
面试题:给你个id,去拿到name,多叉树遍历的更多相关文章
- yii2通过foreach循环遍历在一个用户组中取出id去另一表里查寻信息并且带着信息合并原数组信息---案例
yii2通过foreach循环遍历在一个用户组中取出id去另一表里查寻信息并且带着信息合并元数组信息---案例 public function actionRandomLists(){ //查询到了所 ...
- 2020-07-13:es是去查id再根据id去查数据库这种方式好,还是所有数据都放es,直接去查es好?
福哥答案2020-07-13: 有人觉得第一种方法好,也有人觉得第二种方法好.如果搜索字段远小于显示字段,比如搜索字段为3个,显示字段有20个,这个时候用第一种方法好.es+hbase,一般这样搭配. ...
- sql 某字段存储另一个表的多个id值并以逗号分隔,现根据id去中文并拼接同样以逗号分隔
首先介绍用到的两个函数 charindex(要查找的表达式1,表达式2),返回值为表达式1在表达式2中的下标,未找到则返回0.(sql的下标是从1开始的),例如 select charindex('s ...
- 根据一个分类id 获取这个分类底下所有子分类的商品信息,根据下面方法查询出所有有关分类id 再 根据这些id去商品表里查询所有商品信息
/** * 检测该分类下所有子分类,并输出ID(包括自己) * 数据库字段 catid pid */ function getChildrenIds ($sort_id){ include_once ...
- 2016 G面试题#2 不构造树的情况下验证先序遍历
def isValidTree(POTra): """ POTra :param list: :return: """ if not POT ...
- 剑指offer-面试题54-二叉搜索树的第k大节点-中序遍历
/* 题目: 求二叉搜索树的第k大节点. */ /* 思路: 中序遍历. */ #include<iostream> #include<cstring> #include< ...
- etcd 分布式数据库概念初探
Lease(租约): 其实就是一个定时器.首先申请一个TTL=N的lease(定时器),然后创建key的时候传入该lease,那么就实现了一个定时的key. 在程序中可以定时为该lease续约,也就是 ...
- 去面试Python工程师,这几个基础问题一定要能回答,Python面试题No4
今天的面试题以基础为主,去面试Python工程师,这几个基础问题不能答错 第1题:列表和元组有什么不同? 列表和元组是Python中最常用的两种数据结构,字典是第三种. 相同点: 都是序列 都可以存储 ...
- android 常见面试题以及答案
http://blog.csdn.net/bobo1808/article/details/6783344 1. 请描述下Activity的生命周期.2. 如果后台的Activity由于某 ...
随机推荐
- JZ-070-数字序列中的某一位数字
数字序列中的某一位数字 题目描述 数字以 0123456789101112131415... 的格式序列化到一个字符串中,求这个字符串的第 index 位. 题目链接: 数字序列中的某一位数字 代码 ...
- CPU乱序执行基础 —— Tomasulo算法及执行过程
朋友们可以关注下我的公众号,获得最及时的更新: IBM 360/91浮点单元最先实现Tomasulo算法从而允许乱序执行.360体系只有4个双精度浮点寄存器,限制了编译器调度的有效性.而且,IBM 3 ...
- 研发管理平台DevOps使用流程
研发管理平台DevOps使用流程:一.注册开发者账号二.登录平台三.点击:我的项目-内部项目三.点击"发布内部项目",创建项目五.进入项目六.研发管理平台研发管理平台的功能包括:可 ...
- vctl 使用镜像/换源/mirrors
️ 更新:事实证明,以下方法仅对部分镜像有效 换源 VMware16新增vctl管理容器,使用时发现是从docker.io拉取镜像,国内连接网速较慢.官方似乎并没有给出换源方法. 解决方法:从指定的U ...
- mybatis的几种like查询
oracle数据库: Java代码 SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或 Java代码 SELECT * FROM ...
- ssm 关于mybatis启动报Result Maps collection already contains value for ...的问题总结
Result Maps collection already contains value for com.zhaike.mapping.ChapterMapper.BaseResultMap Err ...
- Linux-timedatectl使用
Linux下使用timedatectl命令时间时区操作详解 timedatectl命令对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系 ...
- (一)【转】asp.net mvc生成验证码
网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中. ...
- Sealer - 把 Kubernetes 看成操作系统集群维度的 Docker
作者 | 中弈 写在开头 身为一名技术人员,总是喜欢把自己的作品打造成理想状态呈现给别人,我非常荣幸能把集群镜像这样一个卓越的想法变成现实, 也非常开心用户使用我们的作品时对我们的高度认可. Seal ...
- redis单机版和集群版搭建笔记-简略版
搭建单机版: 解压 tar -zxf redis-3.0.0.tar.gz 编译 cd redis-3.0.0 安装 make install prefix=/usr/local/redis-inst ...