当前位置: 首页 > news >正文

面试题:给你个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: []
      }
    ];

比如说 我要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

相关文章:

  • 前端CORS请求梳理
  • osquery简单试用
  • 关于Java中分层中遇到的一些问题
  • 156:Ananagrams
  • 区块链技术
  • 浅度理解NodeJS的HTTP模块
  • Git的本地仓库与GitHub的远程仓库
  • haproxy+pacemaker高可用负载均衡
  • 剖析RAC中的@weakify、@strongify
  • 解析PE资源表与重定位表
  • BTA | 周政军:区块链中侧链和分片解决不了的扩容问题,交给DAG吧!
  • PHP定时任务Crontab结合CLI模式详解
  • go append函数以及写入
  • mysql错误Table ‘./mysql/proc’ is marked as crashed and should be repaired
  • 于小镭:区块链将从三方面带来颠覆性认知革命
  • 收藏网友的 源程序下载网
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Brief introduction of how to 'Call, Apply and Bind'
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java正则表式的使用
  • jquery cookie
  • Js基础知识(四) - js运行原理与机制
  • orm2 中文文档 3.1 模型属性
  • 说说动画卡顿的解决方案
  • 通过git安装npm私有模块
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # 计算机视觉入门
  • $.proxy和$.extend
  • ${factoryList }后面有空格不影响
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (arch)linux 转换文件编码格式
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (论文阅读40-45)图像描述1
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET开发者必备的11款免费工具
  • /etc/shadow字段详解
  • @Autowired注解的实现原理
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [100天算法】-不同路径 III(day 73)
  • [AIGC] 如何建立和优化你的工作流?
  • [AutoSar NVM] 存储架构
  • [Codeforces] combinatorics (R1600) Part.2
  • [Django 0-1] Core.Email 模块
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [HTML]HTML5实现可编辑表格