搜索算法系列之 DFS

简介: 搜索算法系列之 DFS

搜索系列之DFS

算法介绍

DFS(Depth-First-Search),即深度优先搜索 。是一种用于遍历或搜索的算法,这个算法会尽可能深的搜索树的分支。即在搜索到一个新节点时,立即对该节点进行遍历,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。重复此过程直到从源节点出发的所有节点均被访问。

DFS 是图论中经典的算法,因为发现此算法,John Edward Hopcroft 和  Robert Endre Tarjan 于 1986年共同获得了图灵奖。

实现方式

基于栈

因为在搜索到一个新的节点时,需要立即对该新节点进行遍历,因此遍历需要用先进后出的栈来实现。

说白了,就两点:

一条道走到黑:先选择当前节点的一个子节点进行深入,然后对子节点再进行深度优先搜索。

撞到南墙再回头:一直搜索到叶节点,然后向上回溯,再对另一个子节点进行深度优先搜索。

例如遍历以下这棵树

假设我们先遍历左孩子,再遍历右孩子。

我们首先定义出树节点Node:

classTreeNode{

 intval;

 TreeNodelChild;  

 TreeNoderChild;

   TreeNode(intvalue){

       val=value;

   }

}

我们创建一个栈用来存放Node节点:

Stack<Node>stack=newStack<Node>;

  1. 我们首先将根节点root放入到栈中:

  1. 然后我们出栈栈顶元素并访问之,再判断其是否存在右左孩子,若存在则将其压入栈中。

(注:我们先压入右孩子,再压入左孩子,这样出栈的时候就保证了先遍历到左孩子再是右孩子)

  1. 紧接着我们又出栈栈顶元素,重复循环步骤 2。

    基于栈完整代码:

classSolution{

 publicvoiddfs(TreeNoderoot){

       if(root==null) returnnull;

       Stack<TreeNode>stack=newStack();

       stack.push(root);

       while(!stack.isEmpty()){

           TreeNodecurrNode=stack.pop();

           System.out.println(currNode.val);  

           if(currNode.rChild!=null){

             stack.push(currNode.rChild);  

           }

           if(currNode.lChild!=null){

               stack.push(currNode.lChild);

           }                  

       }

 }

}

递归

我们知道函数的调用就是栈结构,所以也可以通过递归实现。

同样上边的例子,其实就是树的前序遍历:

classSolution{

 publicvoiddfs(BTreeroot){

       if(root==null) returnnull;

       System.out.println(root.val);

       dfs(root.lChild);

       dfs(root.rChild);    

   }

}


目录
相关文章
|
4天前
|
索引
浅谈两个重要的搜索算法
【5月更文挑战第15天】线性搜索从数组一端按顺序遍历,直到找到目标元素,平均和最坏情况的时间复杂度均为O(N)。二分查找适用于排序数组,通过比较中间元素快速定位目标,最佳、平均和最坏情况的时间复杂度都是O(logN)。
16 6
|
5天前
|
算法 C++
c++算法学习笔记 (6) DFS
c++算法学习笔记 (6) DFS
|
7天前
|
算法
【软件设计师】常见的算法设计方法——穷举搜索法
【软件设计师】常见的算法设计方法——穷举搜索法
|
14天前
|
机器学习/深度学习 存储 人工智能
图搜索算法详解
【5月更文挑战第11天】本文介绍了图搜索算法的基础知识,包括深度优先搜索(DFS)、广度优先搜索(BFS)和启发式搜索(如A*算法)。讨论了图搜索中的常见问题、易错点及避免方法,并提供了BFS和A*的Python代码示例。文章强调了正确标记节点、边界条件检查、测试与调试以及选择合适搜索策略的重要性。最后,提到了图搜索在路径规划、游戏AI和网络路由等领域的应用,并概述了性能优化策略。
19 3
|
14天前
|
机器学习/深度学习 存储 算法
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
17 1
|
14天前
|
算法 搜索推荐 索引
数据结构与算法 搜索(下)
数据结构与算法 搜索(下)
16 0
|
14天前
|
缓存 算法 搜索推荐
数据结构与算法 搜索(上)
数据结构与算法 搜索(上)
11 1
|
14天前
|
数据采集 存储 算法
数据结构与算法 搜索
数据结构与算法 搜索
10 1
|
14天前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
18 0
|
14天前
|
机器学习/深度学习 存储 人工智能
【AI 初识】人工智能中使用了哪些不同的搜索算法?
【5月更文挑战第2天】【AI 初识】人工智能中使用了哪些不同的搜索算法?