c++ 优先队列_深度优先与广度优先,get到了吗

深度优先、广度优先对于理解相对于递归思想要复杂,先看看实际工作中常用的两个例子热热身。

例一、实现将多维数组转换成一维数组,flat方法?

1. 深度遍历

let arr = ['a', ['b', 'c', ['d', 'e', 'f', ['g']]]];
function dfsFlat(array){
let arr = [];
let queue = array;
if(!queue.length){
return [];
}
while(queue.length){
let val = queue.pop();
console.log(val); // => ???
if(Array.isArray(val)){
queue.push(...val);
}else{
arr.unshift(val);
}
}
return arr;
}
dfsFlat(arr);

2. 广度遍历

let arr = ['a', ['b', 'c', ['d', 'e', 'f', ['g']]]];
function bfsFlat(array){
let arr = [];
let queue = array;
if(!queue.length){
return [];
}
while(queue.length){
let val = queue.shift();
console.log(val); // => ???
if(Array.isArray(val)){
queue.push(...val);
}else{
arr.push(val);
}
}
return arr;
}
bfsFlat(arr);

例二、遍历data树形节点?

let data = [
{
name: 'a1',
children: [
{ name: 'b11', children: [{ name: 'qdkc111'}]},
{ name: 'b12', children: [{ name: 'qdkc121'}]},
{ name: 'b13', children: [{ name: 'qdkc131'}]},
],
},
{
name: 'a2',
children: [
{ name: 'b21', children: [{ name: 'qdkc211'}]},
{ name: 'b22', children: [{ name: 'qdkc221'}]},
{ name: 'b23', children: [{ name: 'qdkc231'}]},
]
}
];

1. 深度遍历

let data = [{name:'a1',children:[{name:'b11',children:[{name:'qdkc111'}]},{name:'b12',children:[{name:'qdkc121'}]},{name:'b13',children:[{name:'qdkc131'}]},],},{name:'a2',children:[{name:'b21',children:[{name:'qdkc211'}]},{name:'b22',children:[{name:'qdkc221'}]},{name:'b23',children:[{name:'qdkc231'}]}]}];
function dfsTraversal(node){
let stack = [];
let nodes = [];
if (node) {
stack.push(...node);
while (stack.length) {
let item = stack.pop();
console.log(item); // => ???
nodes.push(item);
let children = item.children;
if (children) {
for (let i = children.length - 1; i >= 0; i--) {

stack.push(children[i]);
}
}
}
}
return nodes;
}
dfsTraversal(data);

2. 广度遍历

let data = [{name:'a1',children:[{name:'b11',children:[{name:'qdkc111'}]},{name:'b12',children:[{name:'qdkc121'}]},{name:'b13',children:[{name:'qdkc131'}]},],},{name:'a2',children:[{name:'b21',children:[{name:'qdkc211'}]},{name:'b22',children:[{name:'qdkc221'}]},{name:'b23',children:[{name:'qdkc231'}]}]}];
let bfsTraversal = function(node){
let nodes = [];
let stack = [];
if (node) {
stack.push(...node);
while (stack.length) {
let item = stack.shift()
console.log(item); // => ???
nodes.push(item);
let children = item.children;
if(children){
for (let i = 0; i < children.length; i++) {
stack.push(children[i])
}
}
}
}
return nodes;
}
bfsTraversal(data);

原理

广度遍历BFS是队列实现,先进先出。
深度遍历DFS是用栈实现,先进后出。

广度遍历步骤

广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:

1、把根节点放到队列的末尾。

2、每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。

3、找到所要找的元素时结束程序。

4、如果遍历整个树还没有找到,结束程序。

深度遍历步骤

深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:

1、把根节点压入栈中。

2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。

3、找到所要找的元素时结束程序。

4、如果遍历整个树还没有找到,结束程序。

工作中非常实用且重要的例子,建议收藏,方便日后查找阅读。

相关文章

1.  flat经常被问到的那些事
2. 广度优先遍历、深度优先遍历

58d323290beba43cffeb8aeeb1c5407d.png

前端咖内容精品,值得关注,在看哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值