自己用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))

JS广度优先遍历的更多相关文章

  1. js实现对树深度优先遍历与广度优先遍历

    深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...

  2. js实现深度优先遍历和广度优先遍历

    深度优先遍历和广度优先遍历 什么是深度优先和广度优先 其实简单来说 深度优先就是自上而下的遍历搜索 广度优先则是逐层遍历, 如下图所示 1.深度优先 2.广度优先 两者的区别 对于算法来说 无非就是时 ...

  3. 邻接表的广度优先遍历(java版)

    到 0 的权是 91 到 2 的权是 31 到 3 的权是 61 到 4 的权是 7 2 到 0 的权是 22 到 3 的权是 5 3 到 0 的权是 33 到 4 的权是 1 4 到 2 的权是 2 ...

  4. 转→js数组遍历 千万不要使用for...in...

    看到一篇内容还不错,但是排版实在糟糕, 逼死强迫症患者啊,直接拉下去找原文连接,找到了,但是已经消失了···500错误... 第一次因为实在看不下去一篇博客的排版, 为了排版而转载... 转载地址:h ...

  5. 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)

    学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...

  6. C++ 二叉树深度优先遍历和广度优先遍历

    二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...

  7. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  8. js对象遍历

    js对象遍历可以使用比较普遍的方法:如下 var ss={aa:"aa",bb:"bb"}; for(var s in ss){ console.info(&q ...

  9. 算法学习 - 图的广度优先遍历(BFS) (C++)

    广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不 ...

随机推荐

  1. ubuntu虚拟机重启后进入initramfs的解决办法

    问题:windows下使用VMware或者自己安装的ubuntu系统出现,不能正常进入系统,而是进入一个以initramfs开头的命令行界面! 原因:不正常的关闭系统,导致系统文件损坏,/dev/sd ...

  2. 编程排序的一个excel-据说玩的好的,年薪50万了。只是你没在对的地方

    是一个excel 下面是百度网盘分享地址; http://pan.baidu.com/s/1kTwqRfL    

  3. 织梦dedecms自由列表的"不使用目录默认主页"错误修正

    站长用织梦做站时常常发现织梦自由列表有个致命的问题: 即修改"不使用目录默认主页"就永远不会自己勾选啦 打开这个文件 makehtml_freelist_action.php 搜索 ...

  4. Codeforces Round #626 (Div. 2) D. Present(位运算)

    题意: 求n个数中两两和的异或. 思路: 逐位考虑,第k位只需考虑0~k-1位,可通过&(2k+1-1)得到一组新数. 将新数排序,当两数和在[2k,2k+1)和[2k+1+2k,2k+2)之 ...

  5. Educational Codeforces Round 95 (Rated for Div. 2) B. Negative Prefixes (贪心,构造)

    题意:给你一串长度为\(n\)的序列,有的位置被锁上了,你可以对没锁的位置上的元素任意排序,使得最后一个\(\le0\)的前缀和的位置最小,求重新排序后的序列. 题解:贪心,将所有能动的位置从大到小排 ...

  6. AtCoder Beginner Contest 173 D - Chat in a Circle (贪心)

    题意:有一个空环和\(n\)个点,每次可以选择一个点放在空环上,并且获得周围两个点中最小的那个的权值,问能获得的最大的权值是多少? 题解:我们每次都优先放最大的进去,注意每次放的时候都要将这个点放在当 ...

  7. Spring Boot @Enable*注解源码解析及自定义@Enable*

      Spring Boot 一个重要的特点就是自动配置,约定大于配置,几乎所有组件使用其本身约定好的默认配置就可以使用,大大减轻配置的麻烦.其实现自动配置一个方式就是使用@Enable*注解,见其名知 ...

  8. codeforce 855B

    B. Marvolo Gaunt's Ring time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  9. codeforces 875B

    B. Sorting the Coins time limit per test 1 second memory limit per test 512 megabytes input standard ...

  10. MAC地址分类

    网卡MAC地址作为互联网设备在以太网中身份的唯一标识在以太网通讯中的作用比IP地址还要重要,MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique i ...