前天面試遇到一個多叉樹面試的題目,在這里分享記錄一下。
題目:一個樹形的數據(如下數據),面試官給你一個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種方法,應該還有很多種方法,大佬們有的話可以留言給我,先謝謝啦~~
安利一波博客~~~https://github.com/naihe138/naice-blog
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94220.html
簡單的遍歷一個樹形結構數據的幾種方法、非遞歸方法效率最好。 (function (window, undefined) { var treeNodes = [ { id: 1, name: 1, children: [ { i...
摘要:講了一下我在電力物聯網項目中通過設計的文件遠程升級功能。完成聊天畢業規劃怎么樣收到面試調查問卷等待中。。。。。 7.31 投遞提前批c++客戶端崗位 8.16 被轉...
摘要:多叉樹的分析及實現好了,終于回到了第一篇文章提到的組織結構的多叉樹實現,有了前兩篇文章的基礎,多叉樹的實現也就變得簡單了從后臺拿到的原始數據形式為總部工程部工程部工程部工程部測試部測試部測試部生產部規劃部市場部這是一個典型的多叉樹結構,總部 js多叉樹的分析及實現 好了,終于回到了第一篇文章提到的組織結構的多叉樹實現,有了前兩篇文章的基礎,多叉樹的實現也就變得簡單了 從后臺拿到的原始數...
閱讀 3242·2021-10-27 14:20
閱讀 2525·2021-10-08 10:05
閱讀 1625·2021-09-09 09:33
閱讀 2902·2019-08-30 13:16
閱讀 1435·2019-08-29 18:34
閱讀 1170·2019-08-29 10:58
閱讀 1228·2019-08-28 18:22
閱讀 1226·2019-08-26 13:33