面試題:給你個id,去拿到name,多叉樹遍歷

前天面試遇到一個多叉樹面試的題目,在這裏分享記錄一下。git

題目:一個樹形的數據(以下數據),面試官給你一個id,而後拿到對應的name?github

數據結構大概是這個樣子面試

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返回是靈芝,請問你有幾種解法??bash

遞歸方法

這題目讓人看到這不就是考用遞歸的方法嘛,代碼以下數據結構

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~~~完成了麼??面試官可能不滿意哦,下面還有幾種解法ui

廣度優先實現

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種方法,應該還有不少種方法,大佬們有的話能夠留言給我,先謝謝啦~~spa

安利一波博客~~~github.com/naihe138/na…code

相關文章
相關標籤/搜索