note_18:BFS和DFS的两道题?

8 篇文章 0 订阅

BFS和DFS的两道题?


参考



1. BFS

有一个结构满足以下形式:
node =
    {name:“1”, children:[
       {name:“2”, children:[ {name:“4”, children:[ ] }, {name:“5”, children:[ ] } ] },
       {name:“3”, children:[ {name:“6”, children:[ ] }, {name:“7”, children:[ ] } ] }
    ] }
打印结果:
[“1”, “2”, “3”, “4”, “5”, “6”, “7”]

画个图,然后用BFS,如果是二叉树的话就相当于层次遍历,可以用队列可以实现。
在这里插入图片描述

(function main() {
  var node = 
	{name:"1", children:[
      {name:"2", children:[ {name:"4", children:[ ] }, {name:"5", children:[ ] } ] }, 
      {name:"3", children:[ {name:"6", children:[ ] }, {name:"7", children:[ ] } ] } 
	 ] };
  var queue = []; // 用队列,因为要遍历完一整层
  queue.push(node);  // 将第一个点入队
  var printArr = [];
  while (queue.length !== 0) { // 当队列空了之后相当于全部结点都遍历了
    var temp = queue.shift();  // 每次都是头一个元素出队
    printArr.push(temp.name);  // 存起来是方便之后输出结果,不用慢慢调格式
    var childs = temp.children; 
    for (var i = 0; i < childs.length; i++) {  // 遍历它的孩子结点,相当于遍历一整层
      var tmp = childs[i];
      queue.push(tmp);  // 遍历了之后入队
    }
  }
  console.log(printArr);  //  ["1", "2", "3", "4", "5", "6", "7"]
}());

2. DFS

有一个结构满足以下形式:
node =
    {name:“1”, children:[
       {name:“2”, children:[ {name:“4”, children:[ ] }, {name:“5”, children:[ ] } ] },
       {name:“3”, children:[ {name:“6”, children:[ ] }, {name:“7”, children:[ ] } ] }
    ] }
打印结果:
[“1”, “2”, “4”, “5”, “3”, “6”, “7”]

画个图,然后用DFS,如果是二叉树的话,相当于先序遍历,可以用递归实现。
在这里插入图片描述

function dfs(node, nodeList) {
  if (node) {
    nodeList.push(node.name); // 先将点放入list中
    var children = node.children; // 获取node的孩子
    for (var i = 0; i < children.length; i++) { 
      dfs(children[i], nodeList); // 对每个孩子结点都用dfs,找一条最深的路径
    }
  }
  return nodeList; // 遍历到最深的时候就是递归出口
}

(function main() {
  var node = 
	{name:"1", children:[
      {name:"2", children:[ {name:"4", children:[ ] }, {name:"5", children:[ ] } ] }, 
      {name:"3", children:[ {name:"6", children:[ ] }, {name:"7", children:[ ] } ] } 
	 ]};
  var printArr = dfs(node, []);  // 会利用到递归来解,因为要遍历到最深的路径才返回
  console.log(printArr);  // ["1", "2", "4", "5", "3", "6", "7"]
}())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值