深度优先算法--对DFS的一些小小的总结(一)

提到DFS,我们首先想到的是对树的DFS,例如下面的例子:
求二叉树的深度

int TreeDepth(BinaryTreeNode* root){

  if(root==nullptr)return 0;

  int left=TreeDepth(root->left);

  int right=TreeDepth(root->right);

  return (left>right)?(left+1):(right+1);

}

求二叉树的最小路径深度

int TreeDepth(BinaryTreeNode* root){

  if(root=nullptr)return 0;

  int left=TreeDepth(root->left);

  int right=TreeDepth(root->right);

  if(left==0||right==0)return 1+left+right;

  return 1+min(left,right);}

或许考察的更深入一些

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

vector<vector<int> >path;//用来记录路径

vector<int> pathnum;

vector<vector<int> >FindPath(TreeNode* root,int expectNumber){

if(root==nullptr)return path;

int curSum=0;

curSum+=root->val;

pathnum.push_back(root->val);

bool isleaf=!(root->left)&&!(root->right);

if(curSum==expectNumber&&isleaf)path.push_back(pathnum);

if(root->left)FindPath(root->left,expectNumber-root->val);

if(root->right)FindPaht(root->right,expectNumber-root->val);

curSum-=root->val;

pathnum.pop_back();

return path;

}

有上面可以看出,DFS面对树的搜索,采用递归,有很好的效果,通常的步骤是

搜索到叶节点,采取的措施

#如果当前状态满足最终的解,则添加到最终解中

# 遍历构造空间,是当前构造解可添加处理操作的空间

# 如果当前遍历的操作对于当前阶段是可行的,则对当前构造解施加操作

#若满足从当前状态下进入下一步处理,进一步搜索解

#从下一个状态搜索状态中返回,无论下一层的是否什么状态。回复本阶段的状态,搜索笨阶段另外可施加的状态

进行操作

上面讲了这么多,然而最近经常发现DFS被应用于字符串或数组的搜索,那么在什么样的情况下需要使用到DFS以及我们使用DFS会达到什么样的效果呢?

下面是一个字符串中是否有回文字段的题,典型的符合上面的状态解释

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s ="aab",
Return

  {
    ["aa","b"],
    ["a","a","b"]
  }void dfs(string s,vector<string> &path,vector<vector<string> >&res){  if(s.empty()){    res.push_back(path);    return;  }  for(int i=0;i<s.size();i++){    string s.substr(0,i+1);    if(Is_palindrome(a))//Is_palindrome判断是否是回文字段函数,这里省略不写了      path.push_back(s.substr(0,i+1));      dfs(s,substr(i+1),path,res);      path.pop_back();    }}vector<vector<string> >patition(string s){  vector<vector<string> >res;  vector<string> path;  dfs(s,path,res);  return res;}
时间: 2024-11-03 22:38:43

深度优先算法--对DFS的一些小小的总结(一)的相关文章

深度优先算法DFS

深度优先算法的Java实现 public class JavaDFS { public int stepnum = 999; /*构建11*11的迷宫,英雄H在(1,1)的位置出发,去解救美女M(6,8),#表示墙壁,*表示炸弹*/ public char[][] graph = { {'#','#','#','#','#','#','#','#','#','#','#'}, {'#','H','_','_','*','_','_','*','_','_','#'}, {'#','_','_',

深度优先搜索(DFS)

定义: (维基百科:https://en.wikipedia.org/wiki/Depth-first_search) 深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止(属于盲目搜索). 基

求水洼的问题(或者是说求图中连通子图的个数)----深度优先算法

遇到这个题的时候,不太容易快速的想到思路:可能会比较容易想到使用递归的思想:但是具体怎么写呢?其实这个题就相当于是图论中的求连通图,很容易应该想到的是深度优先搜索或者是广度优先搜索:我们就用深度优先算法来求这个题目:直接求有几个区域不好求,那么我们换个思路来求,这种题就是这样,直接求不好求,但是当我们转换一下思路之后就豁然开朗: 我们遍历所有的点,当遇到有水的点时,就将它周围的(八个方向)所有的水点都消除:所以在主遍历for循环中遇到几个水点就是有几个水洼: /*****************

在图中寻找最短路径-----深度优先算法C++实现

求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例,用深度优先算法来实现: 在每一个点都有四个方向(有的点的有些方向不能通过),所以在每一个点处要处理四种方向的情况: 深度优先算法函数怎么写? 也就是写递归函数...但是递归函数肿么写??? 第一:判断初始态,从起点出发,刚开始步数为0:dfs(start_x, start_y, 0); 第二:从起

深度优先算法——走迷宫的实现

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图

深度优先算法和广度优先算法

算法:深度优先算法和广度优先算法(基于邻接矩阵) 1.写在前面 图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法. 另一种是基于链表的的邻接表. 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接. 图示表示的是无向图的邻接矩阵,从中我们可以发现它们的分布关于斜对角线对称. 我们在下面将要讨论的是下图的两种遍历方法(基于矩阵的): 我们已经说明了我们要用到的是邻接矩阵表示法,那么我首先要来构造图: 矩阵图的数据

Java与算法之(5) - 老鼠走迷宫(深度优先算法)

小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先用一个二维数组来把迷宫"数字化". [java] view plain copy print? int[][] maze = new int[5][4]; 迷宫中每个格子的横纵坐标对应数组的一维和二维索引,例如最左上角的格子是maze[0][0],数组的值表示该格子是否可以通过,0表示可以

图的深度优先搜索(DFS)简介与实现(递归与非递归方法)

上一篇刚刚学习了C++图的实现,今天对深度优先搜索(DFS)进行了一定学习,并作出一定实现.在本文中图的实现,以及相应的函数调用(如获得第一个邻接顶点.获得下一个邻接顶点等)均是基于上文中的实现,故如果想参考测试代码,还需导入上文中相应的类定义.关于C++图的实现可参考此处,这里实现了对图的邻接表以及邻接矩阵两种实现,而本文的深度优先搜索对于上面两种实现均是可行的. 当然,对于图的深度优先搜索的相关定义,本文也不再过多赘述,维基的解释应该就足够,下面将探讨其实现. 1.深度优先搜索的非递归实现:

深度优先算法+广度优先算法

一 深度优先算法 bool visited[MaxVnum]; void DFS(Graph G,int v) { visited[v]= true; //从V开始访问,flag它 printf("%d",v); //打印出V for(int j=0;j<G.vexnum;j++) if(G.arcs[v][j]==1&&visited[j]== false) //这里可以获得V未访问过的邻接点 DFS(G,j); //递归调用,如果所有节点都被访问过,就回溯,而