广度优先搜索BFS(队列)
找出从根节点到目标节点的最短路径
节点的处理顺序和添加到队列的顺序是完全相同的(先进先出)
广度优先遍历是需要记住所有的节点
Queue:A BCD EFG
// 广度遍历, 创建一个执行队列, 当队列为空的时候则结束
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(',');
}
深度优先搜索DFS(栈)
也可以用来查找从根节点到目标节点的路径(在DFS中找到的第一条路径并不总是最短的路径)
根节点推入栈中,B推入栈中,然后到E进行回溯。
深度优先不需要记住所有的节点,占用空间小,但是深度优先有回溯,时间长。
Stack:A BE CFG 找到了 结束了
// 深度优先遍历 使用递归
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(',');
}