JS广度优先遍历


自己用JS实现了 广度优先遍历

 第一种用了数组的高阶函数,看起来有些复杂。然后思索着从可读性上优化了一下,孰优孰劣以后分析。

var list = [{
    id: "ab", children: [{ id: "ab1", children: [{ id: "ab11", children: [] }] },{ id: "ab2", children: [] }, { id: "cd", children: [{ id: "aa", children: [] }, { id: "ef", children: [] }] }] },{ id:'cc', children:[] },{ id:'dd', children:[] }]
// path[] 1.将list 数组合并到path, 2.从头部开始删除,看是否有子节点,有就合并到path[] 3.重复2,直到path 为空

function breadthFirstSearch(list)
{
    let tree=[]; let path = list.reduce((acc,cur)=>acc=[].concat(acc,cur)); while(path.length>0){ let node = path.shift(); tree.push(node.id); let target = node.children; // console.log(target.length,node.id,target) if(target.length !== 0){ path=[].concat(path, ...target.length==1?target:target.reduce((acc,cur)=>acc=[].concat(acc,cur))); } } return tree; }
console.log(breadthFirstSearch(list))
// [
//     'ab',   'cc',
//     'dd',   'ab1',
//     'ab2',  'cd',
//     'ab11', 'aa',
//     'ef'
//   ]
// 非递归: 1.创建新的数组nodeList, 并赋值list 2.从头遍历nodeList的子节点,并合并到nodeList
function breadthFirstSearch1(list){
    let index=0; let tree=[]; let nodeList = [...list]; while(index<nodeList.length){ const node=nodeList[index++]; tree.push(node.id); if(node.children){ for(let k in node.children){ nodeList.push(node.children[k]); } } } return tree; // return nodeList; } console.log(breadthFirstSearch1(list))

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM