前天面試遇到一個(gè)多叉樹(shù)面試的題目,在這里分享記錄一下。
題目:一個(gè)樹(shù)形的數(shù)據(jù)(如下數(shù)據(jù)),面試官給你一個(gè)id,然后拿到對(duì)應(yīng)的name?
數(shù)據(jù)結(jié)構(gòu)大概是這個(gè)樣子
var cityData = [ { id: 1, name: "廣東省", children: [ { id: 11, name: "深圳", children: [ { id: 111, name: "寶安", children: [ { id: 1111, name: "西鄉(xiāng)", 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: "白云區(qū)", children: [ { id: 1222, name: "白云區(qū)", children: [] } ] }, { id: 122, name: "珠海區(qū)", children: [] } ] } ] }, { id: 2, name: "湖南省", children: [] } ];
比如說(shuō) 我要id是11112的name返回是靈芝,請(qǐng)問(wèn)你有幾種解法??
遞歸方法這題目讓人看到這不就是考用遞歸的方法嘛,代碼如下
let result = "" // 遞歸實(shí)現(xiàn) const recursion = (cityData, id) => { // cityData數(shù)據(jù)為空的時(shí)候直接返回 if (!cityData || !cityData.length) return; // 常規(guī)循環(huán)cityData for (let i = 0, len = cityData.length; i < len; i++) { const childs = cityData[i].children; // 如果匹配到id的話(huà),就是我們要的結(jié)果 if (cityData[i].id === id) { result = cityData[i].name } // 如果還有子節(jié)點(diǎn),執(zhí)行遞歸 if(childs && childs.length > 0){ recursion(childs, id); } } return result }; const r = recursion(cityData, 11112); console.log(r) // 靈芝
oyes~~~完成了么??面試官可能不滿(mǎn)意哦,下面還有幾種解法
廣度優(yōu)先實(shí)現(xiàn)let result = "" const range = (cityData, id) => { if (!cityData || !cityData.length) return; // 定義一個(gè)數(shù)據(jù)棧 let stack = []; let item = null; //先將第一層節(jié)點(diǎn)放入棧 for (var i = 0, len = cityData.length; i < len; i++) { stack.push(cityData[i]); } while (stack.length) { // 將數(shù)據(jù)棧的第一個(gè)取出來(lái) item = stack.shift(); // 如果符合就賦值給result if (item.id === id) { result = item.name } //如果該節(jié)點(diǎn)有子節(jié)點(diǎn),繼續(xù)添加進(jìn)入棧底 if (item.children && item.children.length) { stack = stack.concat(item.children); } } return result }; let r1 = range(cityData, 11112); console.log(r1) // 靈芝深度優(yōu)先實(shí)現(xiàn)
let result = "" const deep = (cityData, id) => { // 沒(méi)有數(shù)據(jù)直接返回 if (!cityData || !cityData.length) return; // 先定義一個(gè)數(shù)據(jù)棧 let stack = [] let item = null //先將第一層節(jié)點(diǎn)放入數(shù)據(jù)棧 for (var i = 0, len = cityData.length; i < len; i++) { stack.push(cityData[i]) } // 循環(huán) while (stack.length) { item = stack.shift() if (item.id === id) { result = item.name } //如果該節(jié)點(diǎn)有子節(jié)點(diǎn),繼續(xù)添加進(jìn)入棧頂 if (item.children && item.children.length) { // 注意這里調(diào)換了順序 stack = item.children.concat(stack); } } return result }; let r3 = deep(cityData, 11112) console.log(r3) // 靈芝正則方式實(shí)現(xiàn)
const regular = (cityData, id) => { // 沒(méi)有數(shù)據(jù)直接返回 if (!cityData || !cityData.length) return; // 數(shù)據(jù)轉(zhuǎn)成字符串 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種方法,應(yīng)該還有很多種方法,大佬們有的話(huà)可以留言給我,先謝謝啦~~
安利一波博客~~~https://github.com/naihe138/naice-blog
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94220.html
簡(jiǎn)單的遍歷一個(gè)樹(shù)形結(jié)構(gòu)數(shù)據(jù)的幾種方法、非遞歸方法效率最好。 (function (window, undefined) { var treeNodes = [ { id: 1, name: 1, children: [ { i...
摘要:講了一下我在電力物聯(lián)網(wǎng)項(xiàng)目中通過(guò)設(shè)計(jì)的文件遠(yuǎn)程升級(jí)功能。完成聊天畢業(yè)規(guī)劃怎么樣收到面試調(diào)查問(wèn)卷等待中。。。。。 7.31 投遞提前批c++客戶(hù)端崗位 8.16 被轉(zhuǎn)...
摘要:多叉樹(shù)的分析及實(shí)現(xiàn)好了,終于回到了第一篇文章提到的組織結(jié)構(gòu)的多叉樹(shù)實(shí)現(xiàn),有了前兩篇文章的基礎(chǔ),多叉樹(shù)的實(shí)現(xiàn)也就變得簡(jiǎn)單了從后臺(tái)拿到的原始數(shù)據(jù)形式為總部工程部工程部工程部工程部測(cè)試部測(cè)試部測(cè)試部生產(chǎn)部規(guī)劃部市場(chǎng)部這是一個(gè)典型的多叉樹(shù)結(jié)構(gòu),總部 js多叉樹(shù)的分析及實(shí)現(xiàn) 好了,終于回到了第一篇文章提到的組織結(jié)構(gòu)的多叉樹(shù)實(shí)現(xiàn),有了前兩篇文章的基礎(chǔ),多叉樹(shù)的實(shí)現(xiàn)也就變得簡(jiǎn)單了 從后臺(tái)拿到的原始數(shù)...
閱讀 3268·2021-10-27 14:20
閱讀 2536·2021-10-08 10:05
閱讀 1635·2021-09-09 09:33
閱讀 2909·2019-08-30 13:16
閱讀 1445·2019-08-29 18:34
閱讀 1180·2019-08-29 10:58
閱讀 1233·2019-08-28 18:22
閱讀 1231·2019-08-26 13:33