前天面试遇到一个多叉树面试的题目,在这里分享记录一下。

题目:一个树形的数据(如下数据),面试官给你一个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: []
}
];

比如说 我要id11112name返回是灵芝,请问你有几种解法??

递归方法

这题目让人看到这不就是考用递归的方法嘛,代码如下


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种方法,应该还有很多种方法,大佬们有的话可以留言给我,先谢谢啦~~

安利一波博客~~~https://github.com/naihe138/naice-blog

本文转载于:猿2048面试题:给你个id,去拿到name,多叉树遍历

面试题:给你个id,去拿到name,多叉树遍历的更多相关文章

  1. yii2通过foreach循环遍历在一个用户组中取出id去另一表里查寻信息并且带着信息合并原数组信息---案例

    yii2通过foreach循环遍历在一个用户组中取出id去另一表里查寻信息并且带着信息合并元数组信息---案例 public function actionRandomLists(){ //查询到了所 ...

  2. 2020-07-13:es是去查id再根据id去查数据库这种方式好,还是所有数据都放es,直接去查es好?

    福哥答案2020-07-13: 有人觉得第一种方法好,也有人觉得第二种方法好.如果搜索字段远小于显示字段,比如搜索字段为3个,显示字段有20个,这个时候用第一种方法好.es+hbase,一般这样搭配. ...

  3. sql 某字段存储另一个表的多个id值并以逗号分隔,现根据id去中文并拼接同样以逗号分隔

    首先介绍用到的两个函数 charindex(要查找的表达式1,表达式2),返回值为表达式1在表达式2中的下标,未找到则返回0.(sql的下标是从1开始的),例如 select charindex('s ...

  4. 根据一个分类id 获取这个分类底下所有子分类的商品信息,根据下面方法查询出所有有关分类id 再 根据这些id去商品表里查询所有商品信息

    /** * 检测该分类下所有子分类,并输出ID(包括自己) * 数据库字段 catid pid */ function getChildrenIds ($sort_id){ include_once ...

  5. 2016 G面试题#2 不构造树的情况下验证先序遍历

    def isValidTree(POTra): """ POTra :param list: :return: """ if not POT ...

  6. 剑指offer-面试题54-二叉搜索树的第k大节点-中序遍历

    /* 题目: 求二叉搜索树的第k大节点. */ /* 思路: 中序遍历. */ #include<iostream> #include<cstring> #include< ...

  7. etcd 分布式数据库概念初探

    Lease(租约): 其实就是一个定时器.首先申请一个TTL=N的lease(定时器),然后创建key的时候传入该lease,那么就实现了一个定时的key. 在程序中可以定时为该lease续约,也就是 ...

  8. 去面试Python工程师,这几个基础问题一定要能回答,Python面试题No4

    今天的面试题以基础为主,去面试Python工程师,这几个基础问题不能答错 第1题:列表和元组有什么不同? 列表和元组是Python中最常用的两种数据结构,字典是第三种. 相同点: 都是序列 都可以存储 ...

  9. android 常见面试题以及答案

    http://blog.csdn.net/bobo1808/article/details/6783344 1.    请描述下Activity的生命周期.2.    如果后台的Activity由于某 ...

随机推荐

  1. Django中的Session和cookie

    Session和cookie 参考文献:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.问题引入 1.1 cookie是什么? 保存在客 ...

  2. 分子动力学模拟之SETTLE约束算法

    技术背景 在上一篇文章中,我们讨论了在分子动力学里面使用LINCS约束算法及其在具备自动微分能力的Jax框架下的代码实现.约束算法,在分子动力学模拟的过程中时常会使用到,用于固定一些既定的成键关系.例 ...

  3. Typora笔记上传到博客

    Typora笔记上传到博客 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版.它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML.PDF 以及本 ...

  4. MySQL中使用IN会不会走索引

    结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描 navicat可视化工具使用explain函数查看sql执行信息 场景1:当IN中的取值只有一个主键时 我们只需要注意一个 ...

  5. 详解java接口interface

    引言 接口这个词在生活中我们并不陌生. 在中国大陆,我们可以将自己的家用电器的插头插到符合它插口的插座上: 我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用U盘进行传输. 插座的普适性是 ...

  6. 什么是CSRF跨站请求伪造?(from表单效验csrf-ajdax效验csrf-Ajax设置csrf-CBV装饰器验证csrf)

    目录 一:csrf跨站请求伪造 1.什么是CSRF? 2.CSRF攻击案例(钓鱼网站) 3.钓鱼网站 内部原理 4.CSRF原理(钓鱼网站内部本质) 5.从上图可以看出,要完成一次CSRF攻击,受害者 ...

  7. 算法 | Java 常见排序算法(纯代码)

    目录 汇总 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 归并排序 6. 希尔排序 6.1 希尔-冒泡排序(慢) 6.2 希尔-插入排序(快) 7. 堆排序 8. 计数排序 9 ...

  8. C 如何将输出的地址转化为十进制数

    •需求 这两天在看内存对齐的相关问题,因此产生了一个,如何将地址转换为十进制数? 对于如下程序: void func() { int a = 10; printf("a 的地址为:%p\n& ...

  9. fastcgi未授权访问及任意命令执行

    1. 漏洞原理 服务端使用fastcgi协议并对外网开放9000端口,攻击者可以构造fastcgi协议包内容,实现未授权访问服务端.php文件以及执行任意命令. 2. 漏洞利用 第一步 搭建vulhu ...

  10. 无传感FOC控制中的转子位置和速度确定方法一

    使用PLL估算器在无感的情况下,估计转子的角度和角速度 PLL估算器的工作原理基于反电动势的d分量在稳态下等于零,其框图如下: ΚΦ 表示电压常量,下面给出了电气转速计算中使用的归 一化 ΚΦ  : ...