深度优先遍历,广度优先遍历

深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。

                  深度优先遍历

主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底...,不断递归重复此过程,直到所有的顶点都遍历完成。

                广度优先遍历

指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

代码如下:

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值