用一个二元组 来表示状态
它表示某个节点(node)和它所在的层数(level)
每个新进队列的节点的层数都是父亲节点的层数加一
最后根据每个点的层数对点进行分类
分类的时候我们可以利用哈希表
维护一个以层数为键,对应节点值组成的数组为值
广度优先搜索结束以后按层数从小到大取出所有值返回即可
class Solution {
public List> levelOrder(TreeNode root) {
List> ret = new ArrayList>();
if (root == null) {
return ret;
}
Queue queue = new linkedList();
queue.offer(root);
while (!queue.isEmpty()) {
List level = new ArrayList();
int currentLevelSize = queue.size();
for (int i = 1; i <= currentLevelSize; ++i) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
ret.add(level);
}
return ret;
}
}
力扣二叉树的层序遍历 II
在遍历完一层节点之后,将存储该层节点值的列表添加到结果列表的尾部
我们需要返回的 List 是一个接口,可以使用链表实现
class Solution {
public List> levelOrderBottom(TreeNode root) {
List> levelOrder = new linkedList>();
if (root == null) {
return levelOrder;
}
Queue queue = new linkedList();
queue.offer(root);
while (!queue.isEmpty()) {
List level = new ArrayList();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
level.add(node.val);
TreeNode left = node.left, right = node.right;
if (left != null) {
queue.offer(left);
}
if (right != null) {
queue.offer(right);
}
}
levelOrder.add(0, level);
}
return levelOrder;
}
}
力扣200. 岛屿数量
难度中等1456收藏分享切换为英文接收动态反馈
如果一个位置为 1,则将其加入队列
每个搜索到的 1 都会被重新标记为 0
直到队列为空,搜索结束
岛屿的数量就是我们进行广度优先搜索的次数
class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
++num_islands;
grid[r][c] = '0';
Queue neighbors = new linkedList<>();
neighbors.add(r * nc + c);
while (!neighbors.isEmpty()) {
int id = neighbors.remove();
int row = id / nc;
int col = id % nc;
if (row - 1 >= 0 && grid[row-1][col] == '1') {
neighbors.add((row-1) * nc + col);
grid[row-1][col] = '0';
}
if (row + 1 < nr && grid[row+1][col] == '1') {
neighbors.add((row+1) * nc + col);
grid[row+1][col] = '0';
}
if (col - 1 >= 0 && grid[row][col-1] == '1') {
neighbors.add(row * nc + col-1);
grid[row][col-1] = '0';
}
if (col + 1 < nc && grid[row][col+1] == '1') {
neighbors.add(row * nc + col+1);
grid[row][col+1] = '0';
}
}
}
}
}
return num_islands;
}
}



