前天面試遇到一個多叉樹面試的題目,在這裏分享記錄一下。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: [] } ];
好比說 我要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~~~完成了麼??面試官可能不滿意哦,下面還有幾種解法code
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種方法,應該還有不少種方法,大佬們有的話能夠留言給我,先謝謝啦~~blog
安利一波博客~~~https://github.com/naihe138/naice-blog遞歸