广度优先搜索
**广度优先搜索(BFS)**的一个常见应用是找出从根结点到目标结点的最短路径。
- 结点的处理顺序是越是接近根结点的结点将越早地遍历。
- 队列的入队和出队顺序是新添加的节点不会立即遍历,而是在下一轮中处理。结点的处理顺序与它们添加到队列的顺序是完全相同的顺序,即先进先出(FIFO)。这就是我们在 BFS 中使用队列的原因。
广度优先搜索-二叉树层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == NULL)
return {};
queue<TreeNode*> queue;
TreeNode* p=root;
vector<vector<int>> res;
queue.push(p);
while(!queue.empty()){
vector<int> temp={};
// 当前层结点个数f
int length=queue.size();
for(int i=0; i<length; i++){
p=queue.front();
queue.pop();
temp.push_back(p->val);
// 将当前层结点的子结点入队
if(p->left) queue.push(p->left);
if(p->right) queue.push(p->right);
}
res.push_back(temp);
}
return res;
}
};
岛屿数量
class Solution {
public:
vector<vector<int>> dir = {{-1,0},{0,-1},{0,1},{1,0}};
int result = 0;
void bfs(vector<vector<char>>& grid,int i,int j) {
int r = grid.size();
int c = grid[0].size();
queue<pair<int,int>> que;
if(grid[i][j] == '1'){
que.push({i,j});
result = result + 1;
//cout<<"que.push [i,j] = ["<<i<<","<<j<<"]"<<endl;
while(!que.empty()){
pair<int,int> cur = que.front();
que.pop();
for(auto d:dir){
int x = cur.first + d[0];
int y = cur.second + d[1];
if(x >= 0 && x <r && y>=0 && y<c ){
if(grid[x][y] == '1') {
que.push({x,y});
//cout<<"que.push [x,y] = ["<<x<<","<<j<<"]"<<endl;
grid[x][y] = '0';
}
}
}
}
}
}
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.empty()){
return 0;
}
int r = grid.size();
int c = grid[0].size();
cout<<r<<" "<<c<<endl;
for(int i = 0; i < r; i++){
for(int j = 0;j < c;j++){
bfs(grid,i,j);
}
}
return result;
}
};
作者:iq91
链接:https://leetcode-cn.com/problems/number-of-islands/solution/c-dao-yu-shu-liang-bfs-by-iq91/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。