面试题:给你个id,去拿到name,多叉树遍历

转载 2018年04月16日 16:48:54

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


二、广度优先实现

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) // 灵芝

多叉树的查找(广度优先遍历)

昨天面试,面试官问了一个题,求一个多叉树里面是否存在某个值,假设多叉树里面的元素都不重复。由于之前一直没有接触过多叉树,所以当时没怎么写出来,当时只是给了自己的思路。import java.util....
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015-09-24 20:47:20
  • 4782

多叉树的递归遍历和堆栈遍历

转自: http://developer.178.com/201104/96593293025.html //多叉树递归遍历 //假设树节点定义为: struct ...
  • u011595231
  • u011595231
  • 2013-09-26 19:29:45
  • 1920

java 多叉树遍历

java 多叉树的遍历 写了二叉的遍历之后,发现多叉也一样的,而且java提供的容器类很方便,手工构造了一颗多叉树。然后再递归遍历。类似于中序遍历吧。 树的节点类: Java代码 ...
  • doymm2008
  • doymm2008
  • 2010-03-23 14:54:00
  • 4953

数据结构_简单的多叉树

简单的多叉树,可以实现从叶子节点遍历到根 和 从根遍历叶子节点的过程: #include #include #include using namespace std; enum { S...
  • u010003835
  • u010003835
  • 2015-10-10 09:35:07
  • 2535

树---多叉树的遍历

package com.Tree; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; //多个...
  • agfagafsdfas
  • agfagafsdfas
  • 2014-11-03 23:35:52
  • 869

多叉树的递归遍历和堆栈遍历【多叉树的前序遍历及后续遍历】

//多叉树递归遍历 //假设树节点定义为: struct Node{ Node *pPNode; list childs; }; //前序遍历(正序遍历): ...
  • TDGX2004
  • TDGX2004
  • 2010-10-14 15:07:00
  • 5658

多叉树的设计、建立、层次优先遍历和深度优先遍历

参考: http://www.cnblogs.com/unixfy/p/3486179.html用户的多叉树数据存储在一个文件中,格式如下: aA 4 g cC z bBbB z 2 f ...
  • UmdCoding
  • UmdCoding
  • 2016-08-25 08:59:59
  • 8692

多叉树的深度遍历

问题:一个根目录下有多个子目录,每个子目录下又有多个子目录,要求按顺序深度遍历输出目录文件。 定义结点对象: package test; import java.util.List; public ...
  • qingmengwuhen1
  • qingmengwuhen1
  • 2017-04-26 22:21:51
  • 1159

java多叉树的生成和遍历

转载另外一个关于多叉树的实现类: TreeNode.java /* * Copyright Walker Studio * All Rights Reserved. * * 文件...
  • shanzhizi
  • shanzhizi
  • 2013-10-25 17:03:32
  • 28799

多叉树的深度优先遍历并输出叶子路径

在做项目的过程中,遇到了多叉树的访问问题,其中要求保存访问至叶子节点的路径,查找网上资料都不是很合心意,故而自己用比较笨的方法保存然后输出 多叉树结构: class DataModel { ...
  • mao_mao37
  • mao_mao37
  • 2017-10-30 16:24:15
  • 273
收藏助手
不良信息举报
您举报文章:面试题:给你个id,去拿到name,多叉树遍历
举报原因:
原因补充:

(最多只允许输入30个字)