首页 > 编程语言 >DFS算法

DFS算法

时间:2024-04-02 14:33:59浏览次数:30  
标签:遍历 target DFS 算法 二叉树 节点 left

DFS,即深度优先搜索(Depth-First Search),是一种用于遍历或搜索树或图的算法。它从起始节点开始,沿着树的深度尽可能远的路径探索,直到达到最深的节点,然后回溯到上一个节点,继续探索其他分支。DFS通常使用递归或栈来实现。

以下是一些常见的DFS算法和应用:

二叉树的DFS
在二叉树中,DFS可以分为先序遍历(preorder)、中序遍历(inorder)和后序遍历(postorder)。

先序遍历:根节点 -> 左子树 -> 右子树
中序遍历:左子树 -> 根节点 -> 右子树
后序遍历:左子树 -> 右子树 -> 根节点
图的DFS
在图中,DFS可以用于寻找连通分量、检测环路、拓扑排序等。

寻找连通分量:从一个节点开始进行DFS,访问所有可达节点,标记已访问的节点,然后选择下一个未被访问的节点作为起始点。
检测环路:在DFS的过程中,如果遇到已经访问过的节点,说明存在环路。
拓扑排序:在有向无环图中,DFS的逆后序遍历结果就是一种拓扑排序。
迷宫问题
在迷宫中,DFS可以用于寻找从起点到终点的路径。通过从起点开始,依次向相邻的未访问过的格子前进,直到到达终点或者无法前进时回溯到上一个节点。

生成括号
通过DFS可以生成有效的括号组合,保证左括号的数量不超过右括号的数量,并且在任何位置左括号的数量都不小于右括号的数量。

解数独
DFS可以用于解数独问题。通过尝试不同的数字填入格子中,并进行回溯,直到找到符合条件的解或者确定无解为止。

全排列
使用DFS可以生成给定数组的所有排列。通过递归的方式,不断交换数组中的元素,得到不同的排列。

总的来说,DFS是一种非常灵活和强大的搜索算法,可以应用于各种问题中,并且通常具有较低的空间复杂度。然而,需要注意的是,DFS可能会陷入无限循环中,因此在应用时需要注意循环检测和合适的终止条件。

以下是一个使用Python实现的简单DFS算法的代码示例,用于在二叉树中查找特定的节点值:

class TreeNode:
    def __init__(self, value):
        self.val = value
        self.left = None
        self.right = None

def dfs(node, target):
    if node is None:
        return False
    
    # 检查当前节点是否为目标节点
    if node.val == target:
        return True
    
    # 递归搜索左子树和右子树
    left_result = dfs(node.left, target)
    right_result = dfs(node.right, target)
    
    # 返回左子树或右子树的结果
    return left_result or right_result

# 示例二叉树
#       1
#      / \
#     2   3
#    / \
#   4   5
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

target_value = 5
if dfs(root, target_value):
    print(f"在二叉树中找到值为 {target_value} 的节点")
else:
    print(f"在二叉树中未找到值为 {target_value} 的节点")

标签:遍历,target,DFS,算法,二叉树,节点,left
From: https://blog.csdn.net/weixin_45780075/article/details/137269150

相关文章

  • 程序员常用的几种算法
    1.排序算法:•冒泡排序(BubbleSort)•选择排序(SelectionSort)•插入排序(InsertionSort)•快速排序(QuickSort)•归并排序(MergeSort)•堆排序(HeapSort)•计数排序(CountingSort)、桶排序(BucketSort)等2.查找算法:•线性搜索(LinearSearch)•......
  • 机器学习实践篇第二篇-KNN算法学习
    一.了解什么是K-NN算法  1.KNN算法原理KNN(K-NearestNeighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为......
  • k-均值聚类算法 Primary
    目录案例——区分好坏苹果(有Key)案例——自动聚类(无Key)k-均值聚类算法(英文:k-meansclustering)定义:k-均值聚类算法的目的是:把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。案例——区分好坏苹......
  • 基于深度学习的疲劳检测算法
    摘要:为了实现对驾驶员驾驶状态的检测预警,避免发生交通事故。提出了一种基于改进多任务级联卷积神经网络(Multi-TaskConvolutionalNeuralNetworks,MTCNN)人脸检测及多特征融合的疲劳检测方法。算法利用改进的MTCNN进行人脸检测和面部9个特征点定位;基于特征点确定出嘴巴、眼睛......
  • 基于深度学习的咖啡豆叶片病害识别算法设计与实现任务书
    一、毕业设计(论文)课题的背景咖啡原产于非洲热带地区,距今发展己有1300多年的的历史。作为饮料,咖啡具有健胃、消食、利尿、醒脑、提神等功效。咖啡含有淀粉、糖分、脂肪和蛋白质等多种营养成分。其中小粒咖啡的主要成分含量为:粗纤维17.94、蛋白质13.86、粗脂肪11.97、淀粉6.......
  • 对二叉树深度优先遍历php算法实现的改进(先序遍历,中序遍历,后序遍历)
        树是一种数据结构,二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。以某种特定顺序访问树中所有的节点称为树的遍历,今天在查看了这遍文章:https://www.cnblogs.com/ivy-zheng/p/10995492.html 中对树的遍历的实现之后我对其PHP遍历算法代码进行了重构,这次......
  • 二叉树结点关键字输出的递归算法实现
    在计算机科学中,二叉树是一种重要的数据结构,广泛应用于各种算法和程序设计中。二叉树的遍历是二叉树操作中的基础问题之一,其目的是以某种规则访问二叉树的每个结点,使得每个结点被且仅被访问一次。给定一个具有n个结点的二叉树,我们需要编写一个递归过程,以O(n)的时间复杂度输出......
  • 基于栈结构的非递归二叉树结点关键字输出算法
    基于栈结构的非递归二叉树结点关键字输出算法一、引言二、二叉树基本概念三、非递归遍历算法基础四、算法设计五、算法实现六、C代码示例七、算法分析八、优化与讨论一、引言在计算机科学中,二叉树是一种重要的数据结构,它广泛应用于各种算法和数据结构中。对于二叉树......
  • Offer必备算法20_队列_宽搜bfs_四道力扣题详解(由易到难)
    目录①力扣429.N叉树的层序遍历解析代码②力扣103.二叉树的锯齿形层序遍历解析代码③力扣662.二叉树最大宽度解析代码④力扣515.在每个树行中找最大值解析代码本篇完。①力扣429.N叉树的层序遍历429.N叉树的层序遍历难度中等给定一个N叉树,返回其节......
  • Hadoop——HDFS文件系统的Java API操作
    2.7.4org.apache.hadoophadoop-hdfs2.7.4org.apache.hadoophadoop-client2.7.4junitjunit4.12IDEA会自动保存文件并且导入依赖包,点击右侧的Maven,展开Dependencies,可以看到四个依赖包以及导入进来了三、初始化我们通过junit来进行测试,首先创建一个类,添加如下内......