BFS,DFS程序(c++)

  • 一个报错:缺少非空判断,或者你写错了对空指针操作了。如:if(!p)...//空指针操作了姐们
leetcode报错:member access within null pointer of type 'struct ListNode'
  • 一维指针可以指向二维数组
int *p;
int a[2][2];
p=&a[1][1];
or
*p=a[1][1];
  • queue&vector
queue
q.push()  //进
q.pop()
vector
v.push_back()
v.pop_back()

 

 

 

BFS

遍历

BFS遍历->层序遍历->无权最短路径  https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l/详解

层序遍历:层序遍历扫描完一行后,下一行从上一行第一个开始寻找,需要添加队列辅助。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 利用d
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vec;
        vector<int> b;
        queue<TreeNode *> q;
        int i,cnt,zov=1;
        TreeNode *t=root;
        if(!root)return vec;
        q.push(root);
        t=root;
        while(!q.empty())  //非NULL
        {
            for(i=0;i<zov;i++)  //每一层
            {
                t=q.front();
                b.push_back(t->val);
                q.pop();
                if(t->left)  //非NULL
                {
                    q.push(t->left);
                    cnt++;
                }
                if(t->right)
                {
                    q.push(t->right);
                    cnt++;
                }
            }
            vec.push_back(b);
            b.clear();
            zov=cnt;   //cnt记录每层非NULL的节点数
            cnt=0;
        }
        return vec;
    }
};

无权网络BFS遍历

void BFS_shortest()
{
 	int i,j,cnt=1,t,zoc=2;
 	queue<int>q;
 	for(i=0;i<N;i++)
 		for(j=0;j<N;j++)
 		{
 			a[i][j]=0;
		}
	a[2][2]=cnt;
	q.push(2);
	q.push(2);
	while(!q.empty())
	{
		cnt++;
		for(t=0;t<zoc/2;t++)
		{
			i=q.front();
			q.pop();
			j=q.front();
			q.pop();
			if(i+1<N&&a[i+1][j]==0)
			{
				a[i+1][j]=cnt;
				q.push(i+1);
				q.push(j);
			}
			if(i>0&&a[i-1][j]==0)
			{
				a[i-1][j]=cnt;
				q.push(i-1);
				q.push(j);
			}
			if(j+1<N&&a[i][j+1]==0)
			{
				a[i][j+1]=cnt;
				q.push(i);
				q.push(j+1);
			}
			if(j>0&&a[i][j-1]==0)
			{
				a[i][j-1]=cnt;
				q.push(i);
				q.push(j-1);
			}
		}	
		zoc=q.size();
	}
}
int main()

多启动BFS

leetcode1162地图分析问题

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        int N=grid.size();
        int i,j,cnt=1,t;  //cnt初始1下列代表距离是2的实际距离为1,和land是1冲突,下面cnt掌握好
        do
        {
            t=0;               
            for(i=0;i<N;i++)
                for(j=0;j<N;j++)
                {
                    if(grid[i][j]==cnt)  //检测到距离为n的点
                    {
                        cout<<cnt<<':';
                        if(i+1<N&&grid[i+1][j]==0)
                        {
                            grid[i+1][j]=cnt+1;
                            t++;
                            cout<<'1';
                        }
                        if(i>0&&grid[i-1][j]==0)
                        {
                            grid[i-1][j]=cnt+1;
                            t++;
                            cout<<'2';
                        }
                        if(j+1<N&&grid[i][j+1]==0)
                        {
                            grid[i][j+1]=cnt+1;
                            t++;
                            cout<<'3';
                        }
                        if(j>0&&grid[i][j-1]==0)
                        {
                            grid[i][j-1]=cnt+1;
                            t++;
                        }
                        cout<<endl;
                     }
                }
            cnt++;
        }while(t);
        if(cnt==2)return -1;
        return cnt-2;
    }
};

DFS

第802题,找图中没有闭环的节点,这题,让我深刻体会到&传递的速度,前三次都是形参漏了&,导致一直超时

/*
找没有环的节点,采用深度优先搜索
//形参传递vector时漏了个&,一直超出时间限制,&确实快!
*/
class Solution {
public:
    vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
        int len,j=0,i=0;
        len=graph.size();
        int flag=1;
        vector<int> a,circle(len,0);        //vector<int> qi(i,0);
        while(i<len)
        {
                if(DFS(graph,i,circle)==0)  // 1.2.下一个节点,3.当前node。4.初始节点
                a.push_back(i);
                i++;
        }
        return a;
    }
    int DFS(vector<vector<int>>& graph,int node,vector<int>& circle)  //漏了个&,&确实快!
    {
        int next_node,num=0;    //每次递归是个新的node,0起始;有return的node才是非0
        if(graph[node].size()==0) return 0; //这条线没环!||//剪枝,这点没环
 //*****if(circle[node]==1)  return -1;//这个点有环  ...放下方while里进入递归前判断
        circle[node]=1;  //访问了当前节点
        while(num<graph[node].size())
        {
            next_node=graph[node][num++] ;  //next_node=graph[node][num]
            if(circle[next_node]==2)continue;
            if(circle[next_node]==1||DFS(graph,next_node,circle)==-1)  
                return -1;      //这个点有环,下方殃及上方
        }
        circle[node]=2;   //这个点没环!
        return 0;

    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值