当前位置: 首页 > news >正文

面试算法高频05-bfs-dfs

dfs bfs

深度优先搜索(DFS)和广度优先搜索(BFS)是图和树遍历中的重要算法,二者在实现方式和应用场景上存在明显差异。

  1. 定义与概念:DFS在遍历树或图时,以深度优先,从起始节点出发,尽可能深入地探索分支,直至无法继续,再回溯;BFS则按层次逐层遍历,从起始节点开始,先访问其所有邻接节点,再进入下一层。
  2. 代码实现
    • DFS递归写法:借助递归函数,通过visited集合记录已访问节点,防止重复访问。对当前节点处理后,递归调用自身处理其未访问的子节点。
    • DFS非递归写法:利用栈数据结构,将起始节点压入栈,循环从栈中弹出节点,处理并标记为访问过,再把相关节点压入栈。
    • BFS写法:使用队列,将起始节点加入队列,循环从队列中取出节点,处理并标记,然后把其相关节点加入队列。
  3. 遍历顺序差异:以二叉树为例,DFS按根节点、左子树、右子树顺序遍历,若有多个子节点,逐个深入;BFS按层次从左到右访问节点,先访问完一层,再进入下一层。
  4. 实战应用:在力扣题目中,二叉树的层次遍历可使用DFS递归或BFS实现。DFS递归通过记录节点层次添加到对应列表;BFS借助队列,逐层处理节点,将同一层节点值收集到列表。最小基因变化问题,可通过BFS搜索基因库,寻找从起始基因到目标基因的最少变化次数,每次变化生成新基因并判断是否在基因库及是否为目标基因。岛屿数量问题,用DFS遍历二维网格,将陆地标记为已访问,通过递归检查相邻陆地,统计岛屿数量。

深度优先搜索(DFS)

  1. 递归写法
visited = set()
def dfs(node):
    if node in visited:
        return
    visited.add(node)
    # 在这里处理当前节点,例如打印节点的值
    print(node.val)
    # 假设node有获取子节点的方法children()
    for next_node in node.children():
        if next_node not in visited:
            dfs(next_node)
  1. 非递归写法
def dfs_non_recursive(root):
    if not root:
        return []
    visited, stack = [], [root]
    while stack:
        node = stack.pop()
        if node not in visited:
            visited.append(node)
            # 在这里处理当前节点,例如打印节点的值
            print(node.val)
            # 假设node有获取子节点的方法children()
            stack.extend([child for child in node.children() if child not in visited][::-1])
    return visited

广度优先搜索(BFS)

from collections import deque

def bfs(root):
    if not root:
        return []
    visited, queue = [], deque([root]

相关文章:

  • 科技赋能记忆共生-郑州
  • 【Java学习笔记】Java第一课,梦开始的地方!!!
  • (八)lerobot开源项目扩展so100的仿真操控(操作记录)
  • 【NIO番外篇】之组件 Channel
  • 《车辆人机工程-》实验报告
  • Linux进程替换与自定义shell详解
  • redisson的unlock方法
  • 行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第一部分)
  • GO语言入门:字符串处理1(打印与格式化输出)
  • Embedding质量评估、空间塌缩、 Alignment Uniformity
  • 【数据结构_5】链表(模拟实现以及leetcode上链表相关的题目)
  • 【AI】SpringAI 第一弹:SpringAI 的兴起介绍
  • NR 5G中的N5接口
  • 考研单词笔记 2025.04.13
  • 达梦数据库-学习-21-某表的空间占用过大处理过程
  • 【区块链+ 人才服务】龙岩市区块链实训实验室 | FISCO BCOS 应用案例
  • DPP推荐引擎架构升级演进之路|得物技术
  • 从红黑树到哈希表:原理对比与典型场景应用解析(分布式以及布隆过滤器)
  • Redis几个基本的全局指令
  • mysql事务脏读 不可重复读 幻读 事务隔离级别关系
  • “特朗普效应”下澳大利亚执政工党赢得大选,年轻选民担忧房价
  • 胖东来回应“浙江‘胖都来’卖场开业”:已取证并邮寄律师函
  • 月薪3万文科友好,“AI训练师”真有那么赚?
  • 韩国经济副总理崔相穆宣布辞职
  • 赵乐际主持十四届全国人大常委会第十五次会议闭幕会并作讲话
  • 城市更新·简报│中央财政支持城市更新,倾斜超大特大城市