那些年,我们一起”追“的DFS和BFS

[题图无关,仅以此纪念我们逝去的青春]

虽然已经离开学校多年,但相信很多小伙伴对DFS和BFS这两个词还不算陌生。

由于我们前端日常开发中需要算法编程的场景其实不多,所以前端同学更有必要额外花点时间温习和巩固。

一来是因为现在外面都流行面试造航母,数据结构和算法基本大厂必考;二来是这东西也是咱程序员安身立命的基础,你可以不用,但是不能不懂。

下面,我就尝试用最简单易懂的语言和案例,跟大家一起回顾一下前端面试中最高频出现的两个算法:DFSBFS

假设有一棵树,它的结构长这样:

js 复制代码
// 示例树
//       1
//     / | \
//    2  3  4
//   /|   \
//  5 6    7

我们以这个实例树为基础,分别演示和讲解这两种算法的原理。

DFS:深度优先搜索

【深度优先搜索】顾名思义就是搜索时永远以"刨根问底",直到把当前路径走到头再返回上一层继续以深度优先的原则去搜索。

代码示例:

js 复制代码
// 定义树节点构建方法
function TreeNode(val) {
  this.val = val;
  this.children = [];
}

// 创建一个示例树
const root = new TreeNode(1);
root.children.push(new TreeNode(2), new TreeNode(3), new TreeNode(4));
root.children[0].children.push(new TreeNode(5), new TreeNode(6));
root.children[1].children.push(new TreeNode(7));

// DFS函数
function dfs(node) {
  if (node == null) return;
  console.log(node.val); // 访问当前节点的值
  // 遍历所有子节点
  for (let child of node.children) {
    dfs(child); // 递归调用DFS
  }
}

// 执行DFS遍历
dfs(root);

// 依次打印
// 1
// 2
// 5
// 6
// 3
// 7
// 4

在这个例子中,我们首先定义了一个TreeNode类,用于创建树节点。每个节点有一个值val和一个子节点数组children

然后,我们定义了一个dfs函数,它接受一个节点作为参数。如果节点不为空,它会打印节点的值,然后递归地对每个子节点调用dfs函数,从而实现深度优先遍历。

最后,我们创建了一个简单的树结构,并调用dfs函数来遍历它。在控制台中,你将看到按深度优先顺序打印的节点值。

BFS:广度优先搜索

【广度优先搜索】顾名思义就是搜索时永远把当前层级的节点都遍历到,再查找下一层级,一层层查找直到最后一层。

代码示例:

js 复制代码
// 定义树节点构建方法
function TreeNode(val) {
  this.val = val;
  this.children = [];
}

// 创建一个示例树
const root = new TreeNode(1);
root.children.push(new TreeNode(2), new TreeNode(3), new TreeNode(4));
root.children[0].children.push(new TreeNode(5), new TreeNode(6));
root.children[1].children.push(new TreeNode(7));

function bfs(root) {
    if (!root) return; // 如果根节点为空,则直接返回

    const queue = []; // 创建一个队列
    queue.push(root); // 将根节点入队

    while (queue.length > 0) { // 当队列不为空时,继续遍历
        const node = queue.shift(); // 取出队列的第一个节点

        console.log(node.val); // 打印当前节点的值

        // 将当前节点的所有子节点入队
        for (const child of node.children) {
            queue.push(child);
        }
    }
}

// 执行BFS遍历
bfs(root);

// 依次打印
// 1
// 2
// 3
// 4
// 5
// 6
// 7

这段代码将会按照广度优先的顺序遍历给定的树结构,并打印出每个节点的值。遍历的顺序将是:1, 2, 3, 4, 5, 6, 7。

篇幅有限,本文也只是浅尝辄止,从原理上大概的讲解了下DFS和BFS,算是勉强应付面试的入门篇。

如果对此感兴趣,想系统学习、掌握数据结构和算法,可以看这里

相关推荐
愚者游世1 分钟前
Delegating Constructor(委托构造函数)各版本异同
开发语言·c++·程序人生·面试·改行学it
梵刹古音3 分钟前
【C语言】 指针基础与定义
c语言·开发语言·算法
啊阿狸不会拉杆21 分钟前
《机器学习导论》第 5 章-多元方法
人工智能·python·算法·机器学习·numpy·matplotlib·多元方法
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
信码由缰1 小时前
Spring Boot 面试问题
spring boot·后端·面试
_OP_CHEN1 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
TracyCoder1231 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九2 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈2 小时前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法
子春一2 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏