JS深度优先遍历和广度优先遍历

简介: 深度优先遍历:是指自上而下的遍历。 广度优先遍历:是指逐层遍历。 深度优先不需要记住所有的节点,所以占用空间小,而广度优先需要记录所有的节点,所以占用大。 深度优先有回溯操作(没有路走了需要回头)所以

之前知识对深度优先遍历和广度优先遍历有一个浅显的了解,后来详细查询资料,做了如下整理。

理念

1、深度优先遍历

是指自上而下的遍历。

2、广度优先遍历

是指逐层遍历。

优势对比

1、理念对比

深度优先不需要记住所有的节点,所以占用空间小;

而广度优先需要记录所有的节点,所以占用大。

深度优先有回溯操作(走到最底层,再从第一层开始)所以相对而言时间会长一点。

深度优先采用的是 堆栈 的形式, 即先进后出

广度优先则采用的是 队列 的形式, 即先进先出

2、事例对比

深度遍历, 多采用递归实现;

广度遍历, 采用队列实现;

const data = [
    {
        name: 'a',
        children: [
            { name: 'b', children: [{ name: 'e' }] },
            { name: 'c', children: [{ name: 'f' }] },
            { name: 'd', children: [{ name: 'g' }] },
        ],
    },
    {
        name: 'a2',
        children: [
            { name: 'b2', children: [{ name: 'e2' }] },
            { name: 'c2', children: [{ name: 'f2' }] },
            { name: 'd2', children: [{ name: 'g2' }] },
        ],
    }
]

// 深度遍历, 多采用递归
function getName(data) {
    const result = [];
    data.forEach(item => {
        const map = data => {
            result.push(data.name);
            data.children && data.children.forEach(child => map(child));
        }
        map(item);
    })
    return result.join(',');
}

// 广度遍历, 创建一个执行队列, 当队列为空的时候则结束
function getName2(data) {
    let result = [];
    let queue = data;
    while (queue.length > 0) {
        [...queue].forEach(child => {
            queue.shift();
            result.push(child.name);
            child.children && (queue.push(...child.children));
        });
    }
    return result.join(',');
}

console.log(getName(data))
console.log(getName2(data))

应用

在Vue中多用于深度优先;

在React重多用于广度优先

结语

感谢您的阅读!希望本文带给您有价值的信息。

如果对您有帮助,请「点赞」支持,并「关注」我的主页获取更多后续相关文章。同时,也欢迎「收藏」本文,方便以后查阅。

写作不易,我会继续努力,提供有意义的内容。感谢您的支持和关注!

目录
相关文章
|
4月前
|
JavaScript 前端开发 索引
js遍历的方法与区别
js遍历的方法与区别
64 3
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-数组的遍历
关于JavaScript数组遍历基础知识的文章。
41 2
JavaScript基础知识-数组的遍历
|
2月前
|
JavaScript
js之遍历方法
js之遍历方法
13 0
|
4月前
|
JavaScript 前端开发
JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
这篇文章介绍了JavaScript中的数组、Date对象、Math对象以及包装类(String、Number、Boolean),并详细讲解了数组的创建、方法(如forEach、push、pop、unshift、slice、splice)和遍历操作,以及工厂方法创建对象和原型对象的概念。
JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
|
4月前
|
机器学习/深度学习 JavaScript
node.js实现遍历所有文件夹里面的js文件,提取所有的url
node.js实现遍历所有文件夹里面的js文件,提取所有的url
|
4月前
|
JavaScript
js之遍历方法
js之遍历方法
39 0
|
5月前
|
JavaScript API
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
86 1
|
5月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
71 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
5月前
|
算法 JavaScript
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
53 0
|
5月前
|
JavaScript 前端开发
JavaScript 遍历DOM
JavaScript 遍历DOM
45 0