首页 > 其他分享 >解释下深度优先遍历和广度优先遍历的区别及如何实现

解释下深度优先遍历和广度优先遍历的区别及如何实现

时间:2024-12-05 09:11:48浏览次数:7  
标签:node neighbors 优先 遍历 value visited 广度 节点

深度优先遍历 (DFS) 和广度优先遍历 (BFS) 都是图和树数据结构的遍历算法,它们的主要区别在于访问节点的顺序。

深度优先遍历 (DFS)

  • 概念: DFS 就像走迷宫一样,沿着一条路走到底,遇到死胡同再回溯到上一个岔路口,选择另一条路继续走,直到遍历完所有节点。它优先探索当前节点的分支,尽可能深入。

  • 实现 (JavaScript):

// 递归实现
function dfsRecursive(node, visited = new Set()) {
  if (!node || visited.has(node)) {
    return;
  }

  visited.add(node);
  console.log(node.value); // 处理当前节点

  for (const neighbor of node.neighbors) {
    dfsRecursive(neighbor, visited);
  }
}


// 迭代实现 (使用栈)
function dfsIterative(node) {
  const stack = [];
  const visited = new Set();

  stack.push(node);

  while (stack.length > 0) {
    const currentNode = stack.pop();

    if (!currentNode || visited.has(currentNode)) {
      continue;
    }

    visited.add(currentNode);
    console.log(currentNode.value); // 处理当前节点

    // 注意:这里需要反向推入邻居节点,以保证先访问左子树/第一个邻居
    for (let i = currentNode.neighbors.length - 1; i >= 0; i--) {
      stack.push(currentNode.neighbors[i]);
    }
  }
}


// 示例用法 (假设 node 为树/图的根节点,且节点具有 value 和 neighbors 属性)
const node = { 
    value: 1, 
    neighbors: [
        { value: 2, neighbors: [{ value: 4, neighbors: [] }, { value: 5, neighbors: [] }] },
        { value: 3, neighbors: [{ value: 6, neighbors: [] }, { value: 7, neighbors: [] }] }
    ]
};

console.log("DFS (Recursive):");
dfsRecursive(node);

console.log("\nDFS (Iterative):");
dfsIterative(node);

广度优先遍历 (BFS)

  • 概念: BFS 就像水波纹一样,从起始节点开始,一层一层地向外扩展,先访问所有距离起始节点为 1 的节点,然后是距离为 2 的节点,以此类推。它优先探索当前节点的所有邻居节点。

  • 实现 (JavaScript):

function bfs(node) {
  const queue = [];
  const visited = new Set();

  queue.push(node);
  visited.add(node);

  while (queue.length > 0) {
    const currentNode = queue.shift();
    console.log(currentNode.value); // 处理当前节点

    for (const neighbor of currentNode.neighbors) {
      if (!neighbor || visited.has(neighbor)) {
        continue;
      }

      visited.add(neighbor);
      queue.push(neighbor);
    }
  }
}


// 示例用法 (使用与 DFS 相同的示例数据)
console.log("\nBFS:");
bfs(node);

区别总结:

特性 DFS BFS
数据结构 栈 (迭代实现) 或 递归 队列
访问顺序 先深度后广度 先广度后深度
空间复杂度 最坏情况 O(h) (h 为树的高度) 最坏情况 O(w) (w 为树的最大宽度)
应用场景 查找路径、检测环、拓扑排序 查找最短路径、连通性问题

前端开发中的应用:

  • DFS: DOM 树遍历、查找特定元素、依赖关系解析。
  • BFS: 页面元素查找 (例如,查找距离某个元素最近的具有特定类的元素)、网络爬虫、游戏中的寻路算法。

希望这个解释对您有所帮助! 请根据您的具体需求选择合适的遍历算法。

标签:node,neighbors,优先,遍历,value,visited,广度,节点
From: https://www.cnblogs.com/ai888/p/18587736

相关文章

  • 力扣103. 二叉树的锯齿形层次遍历
    链接:103.二叉树的锯齿形层序遍历-力扣(LeetCode)vector<vector<int>>vec;if(root==nullptr)returnvec;queue<TreeNode*>que;que.push(root);//true代表从左到右//false代表从右到左boolflag=true;while(!q......
  • 代码随想录算法训练营第十六天(LeetCode513.找树左下角的值;LeetCode112.路径总和;LeetCo
    LeetCode513.找树左下角的值题目连接:找树左下角的值题目连接代码递归法/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.......
  • nginx中的正则表达式,location路径匹配规则和优先级 转载
    博客园熊仔其人原创,侵权删,前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式、location路径匹配规则和优先级。先准备好环境,基础配置是这样nginx/conf/conf.d/host.conf:server{listen8081;server_name10.90.5.70;proxy_connect_timeout60;pr......
  • 94. 二叉树的中序遍历
    题目:https://leetcode.cn/problems/binary-tree-inorder-traversal/description/思路:中序遍历非递归算法Java代码如下:importjava.util.*;classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(){}TreeNode(intval){this.val=val;}TreeNode(intva......
  • 全面解析二叉树的层次遍历及其实现
    二叉树的层次遍历(LevelOrderTraversal)是以层为单位,从根节点开始逐层访问节点的遍历方法。在很多树的算法中,层次遍历是基础。本文将详细解析层次遍历的原理,提供Java和Python的实现,以及常见扩展应用。一、层次遍历的定义与特点1.1什么是层次遍历?层次遍历是指按照二叉......
  • 根据元素ID遍历树形结构,查找到所有父元素ID [代码]
    functionfindParentIds(elementId,treeData){constparentIds=[];functiontraverse(node){if(node.id===elementId){returntrue;}if(node.children){for(constchildofnode.children){if(traverse(child))......
  • ospf-开放式最短路径优先协议
    一、为什么会有OSPF1、OSPF可以管理大型复杂政企网络,数据中心网络2、OSPF快速检查网络变化,迅速更新路由,保证公司网络不中断,提高网络的可靠性3、OSPF引入区域,可以支持网络扩展,降低设备压力,提高数据转发效率4、OSPF支持认证,能够增强网络的安全性二、OSPF应用场景主要应用......
  • 一不小心就容易出错的c语言运算符优先级
      有些人说c语言是简洁高效的,又有些人说c语言是深邃复杂的,说实话,这确实是仁者见仁智者见智。但是有一点不可否认,c语言中的运算符众多,不注意的话,确实很容易弄错。一、*与.的优先级比较  对于一个结构体p包含一个指针*f,那么*p.f的运算优先规则是怎样?  *p.f=*(p......
  • 【代码随想录】刷题记录(55)-从中序与后序遍历序列构造二叉树
    题目描述:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例1: 输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例2:......
  • 遍历for循环的使用
    笔记#遍历字符串foriin'hello':print(i)#range()函数,Python中的内置函数,产生一个[n,m)的整数序列,包含n但是不包含mforiinrange(1,11):#print(i)ifi%2==0:print(i,'是偶数')#计算1-10之间的累加和s=0#用于存储累加和foriinr......