广度优先遍历总结

广度优先遍历

广度优先搜索是最简便的图的搜索算法之一,其别名又叫 B F S BFS BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
B F S BFS BFS 一般通过一个 Q u e u e Queue Queue 来实现。

题目总结

二叉树的层次遍历

比如,给定二叉树 [ 1 ,   2 ,   3 ,   n u l l ,   n u l l ,   4 ,   5 ] [1,\,2,\,3,\,null,\,null,\,4,\,5] [1,2,3,null,null,4,5]
1 \qquad1 1
   ↙ ↘ \;\quad\swarrow\searrow
      2          3 \;\;\,2\quad\;\;\;\;3 23
      ↙ ↘ \quad\quad\;\;\,\swarrow\searrow
  4   5 \qquad\,4\qquad\,5 45
遍历结果为 [ 1 ,   2 ,   3 ,   4 ,   5 ] [1,\,2,\,3,\,4,\,5] [1,2,3,4,5]

public class BFS{
	public List<Integer> bfs(TreeNode root){
		List<Integer> ans;
		Queue<TreeNode> queue;

		ans = new ArrayList<>():
		queue = new LinkedList<>();
		if(root == null)
			return ans;
		queue.offer(root);
		while(!queue.isEmpty()){
			root = queue.poll();
			if(root.left != null)
				queue.offer(root.left);
			if(root.right != null)
				queue.offer(root.right);
		}
		return ans;
	}
}

被围绕的区域

给定一个二维的矩阵,包含 ′ X ′ 'X' X ′ O ′ 'O' O(字母 O O O)。
找到所有被 ′ X ′ 'X' X 围绕的区域,并将这些区域里所有的 ′ O ′ 'O' O ′ X ′ 'X' X 填充。
示例:
X    X    X    X X\;X\;X\;X XXXX
X    O    O    X X\;O\;O\;X XOOX
X    X    O    X X\;X\;O\;X XXOX
X    O    X    X X \;O\;X\;X XOXX
运行你的函数后,矩阵变为:
X    X    X    X X\;X\;X\;X XXXX
X    X    X    X X\;X\;X\;X XXXX
X    X    X    X X\;X\;X\;X XXXX
X    O    X    X X \;O\;X\;X XOXX
来源:leetcode-130

思路:现在边界上找到 ′ O ′ 'O' O,然后根据 B F S BFS BFS 算法找出所有与它连起来的 ′ O ′ 'O' O,标记这些 ′ O ′ 'O' O,这里用 ′ C ′ 'C' C,然后再遍历一次,把没标记的 ′ O ′ 'O' O 变成 ′ X ′ 'X' X, 标记了的 ′ C ′ 'C' C 重现改成 ′ O ′ 'O' O

class Solution {
    public void solve(char[][] board) {
        int m, n, i, j;
        int[] next;
        Queue<int[]> queue;
        
        queue = new LinkedList<>();
        m = board.length;
        if(m == 0)
            return;
        n = board[0].length;
        if(m < 2 || n < 2)
            return;
        for(j = 0; j < n; j++){
            if(board[0][j] == 'O'){
                queue.offer(new int[]{0, j});
            }
            if(board[m-1][j] == 'O'){
                queue.offer(new int[]{m - 1, j});
            }
        }
        for(i = 1; i < m - 1; i++){
            if(board[i][0] == 'O'){
                queue.offer(new int[]{i, 0});
            }
            if(board[i][n-1] == 'O'){
                queue.offer(new int[]{i, n - 1});
            }
        }
        while(!queue.isEmpty()){
            next = queue.poll();
            i = next[0];
            j = next[1];
            board[i][j] = 'C';
            if(check(board, i + 1, j)){
                queue.offer(new int[]{i + 1, j});
            }
            if(check(board, i - 1, j)){
                queue.offer(new int[]{i - 1, j});
            }
            if(check(board, i, j + 1)){
                queue.offer(new int[]{i, j + 1});
            }
            if(check(board, i, j - 1)){
                queue.offer(new int[]{i, j - 1});
            }
        }
        for(i = 0; i < m; i++){
            for(j = 0; j < n; j++){
                if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                }else if(board[i][j] == 'C'){
                    board[i][j] = 'O';
                }
            }
        }
	}

    private boolean check(char[][] board, int i, int j){
        if(i < 0 || j < 0 || i == board.length || j == board[0].length)
            return false;
        return board[i][j] == 'O';
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值