码迷,mamicode.com
首页 > 其他好文 > 详细

dfs初探

时间:2018-10-20 22:46:37      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:数组   出现   define   ace   com   sizeof   src   节点   oid   

dfs初探

 

慕课(视频)pku的dfs例子实现

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int path[11];
int arr[11][11];
bool tag[11];
#define endl ‘\n‘
?
/*
dfs的四个步骤
1、定义dfs的功能
2、if() 结束条件
3、写一个for(遍历所有子节点)
4、return dfs的结果
*/
?
bool dfs1(int v,int end,int& depth) //输出其中一条路径,但是这样没有遍历所有的点,所以不算是完整的dfs
{
if(v==end)
{
path[depth]=v;
depth++; //注意先赋值再++
return true;
}

if(tag[v]==false) return false;

tag[v]=false;
path[depth]=v;
depth++;
for(int i=1;i<11;i++)
{
if(arr[v][i]==1 && dfs1(i,end,depth))
return true;
}
depth--;
return false;

}
?
?
void dfs2(int v,int end,int depth)
{
if(v==end)  
{
path[depth]=v;
for(int i=0;i<=depth;i++)
printf("%d ",path[i]);
printf("\n");
return;
}

if(tag[v]==false) return;

tag[v]=false;
path[depth]=v;
for(int i=1;i<11;i++)
{
if(arr[v][i]==1)
dfs2(i,end,depth+1);
}
tag[v]=true;
}
?
?
?
int main()
{

memset(arr,0,sizeof(arr)); //在cstring库里,把数组全部初始化为0
arr[1][2]=arr[1][3]=1;
arr[2][1]=arr[2][4]=1;
arr[3][1]=arr[3][4]=arr[3][5]=arr[3][7]=1;
arr[4][2]=arr[4][3]=arr[4][5]=arr[4][8]=1;
arr[5][3]=arr[5][4]=arr[5][6]=1;
arr[6][5]=arr[6][8]=1;
arr[7][3]=arr[7][9]=arr[7][10]=1;
arr[8][4]=arr[8][6]=1;
arr[9][7]=arr[10][7]=1;
?
//bool tag[11]注意在全局里面定义了,这边再定义一次。初始化是针对这边的数组,但是函数中用的是全局的
//这样就会出现逻辑错误
memset(tag,1,sizeof(tag));
int num=0;
int& depth=num;
int begin=1;
int end=8;

printf("全部路径:\n");
dfs2(begin,end,0);

printf("输出其中一条路径\n");
if(dfs1(begin,end,depth))
  {
  for(int i=0;i<depth;i++)
  printf("%d ",path[i]);
  printf("\n");
}


return 0;
}



 

执行结果如下:

 

技术分享图片 

 

leetcode104

 

树是图的一种,只是他是只有左右节点(即只有两个子节点的图)

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
public:
  //法一,由下向上
  int dfs1(TreeNode* root)
  {
      if(root->left==NULL && root->right==NULL)
          return 1;
      int left_len,right_len;
      if(root->left) left_len=dfs(root->left); //注意左or右节点为空的时候。
      else   left_len=0;
      if(root->right) right_len=dfs(root->right);
      else   right_len=0;
      return (max(left_len,right_len)+1);
  }
   
   
  //法二 由上而下
  void dfs2(TreeNode* root,int depth,int& max_depth)
  {
      if(root->left==NULL && root->right==NULL)
          max_depth=max(depth,max_depth);
     
      if(root->left)
        dfs(root->left,depth+1,max_depth);
       
      if(root->right)
          dfs(root->right,depth+1,max_depth);
     
       
  }
   
   
  int maxDepth(TreeNode* root)
  {
      if(!root)   //注意空树的时候
          return 0;
      int ans=0;
      int& max_depth=ans; //不能用全局函数的话,可以用引用代替
      dfs2(root,1,max_depth); //depth初始化为1
      return max_depth;
  }
};
//一个空树   左右节点不全在的时候

 

dfs初探

标签:数组   出现   define   ace   com   sizeof   src   节点   oid   

原文地址:https://www.cnblogs.com/zmmz/p/9823255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!