给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3/ 9 20/ 15 7
返回它的最小深度 2.
上面我提到了广度搜索的过程, 必然是笔者特意安排的点,因为基础广度优先遍历是存在一个大体思路和模板的,既然是入门,那么就不说废话直接搬上这个模板给各位品尝!
queue.offer( 初始化时符合条件的点 )while(queue.isNotEmpty){T cur = queue.poll();//这里做 根据cur做一些操作 If(cur的相邻点1符合条件){queue.offer(cur的相邻点1);}If(cur的相邻点2符合条件){queue.offer(cur的相邻点2);}...}
可能看着上面这个模板还是有点不通透,因为这个模板太通用了,要使用到这道题上面来还是需要改动,这里笔者给出完全符合这道题目的模板
queue.offer( 树的根节点 )while(queue.isNotEmpty){int size = queue.size();for(int i = 0; i < size; i++){T cur = queue.poll();//这里判断cur是否有子节点,如果没有直接return;If(cur的左子节点不为空){queue.offer(cur.left);}If(cur的右子节点不为空){queue.offer(cur.right);}}}
进一步清晰模板以后,可以发现多了一个for循环,这个循环有何用呢?
先把上面题目里面的树的图拿下来,方便讲解
3/ 9 20/ / 6 12 15 7
那么现在我就贴上完整的AC代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
import java.util.Queue;
import java.util.LinkedList;
class Solution {public int minDepth(TreeNode root) {if(root == null){return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int level = 1;while(!queue.isEmpty()){int size = queue.size();for(int i = 0; i < size; i++){TreeNode cur = queue.poll();if(cur.left == null && cur.right == null){return level;}if(cur.left != null){queue.offer(cur.left);}if(cur.right != null){queue.offer(cur.right);}}level++;}return level;}
}
上面已经有了那么多的介绍,那么代码里面就不再出现注释了,如果你可以看懂这段代码,那么恭喜你,已经打开了广度优先搜索的大门!
腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:
在这里插入图片描述
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
示例 1:
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
queue = ... queue.offer(所有腐烂的橘子坐标) 1.__________while(queue.isNotEmpty()){int size = queue.size();for(int i = 0; i < size; i++){T cur = queue.poll() ...//判断当前橘子的上下左右橘子是不是新鲜的,是:腐烂、入队,不是:就略过}2.______________}
import java.util.Queue;
import java.util.LinkedList;
class Solution {//用于存放橘子坐标的类class Orange{int x;int y;public Orange(int x, int y){this.x = x;this.y = y;}}public int orangesRotting(int[][] grid) {//为了方便待会对四个方向进行遍历而存在的数组,预存四个方向的加减坐标int[] posx = new int[]{1, 0, -1, 0};int[] posy = new int[]{0, 1, 0, -1};int count = 0;//二维数组的俩个lenint len1 = grid.length;int len2 = grid[0].length;Queue<Orange> queue = new LinkedList();//初始遍历整个二维数组,找到所有腐烂的橘子作为第一次遍历的点for(int i = 0; i < len1; i++){for(int j = 0; j < len2; j++){if(grid[i][j] == 2){queue.offer(new Orange(i, j));}}}//开始whilewhile(!queue.isEmpty()){int size = queue.size();boolean flag = false;//一次for代表一个时刻for(int i = 0; i < size; i++){Orange cur = queue.poll();//遍历当前点的四个方向for(int j = 0; j < 4; j++){//判断四个方向的点是否符合条件,前四个是判断是否越界,//第五个条件是判断那个点是不是新鲜的橘子,若不是,则跳过if(cur.x + posx[j] < 0 || cur.x + posx[j] >= len1 || cur.y + posy[j] < 0 || cur.y + posy[j] >= len2 ||grid[cur.x + posx[j]][cur.y + posy[j]] != 1){continue;}//能够进入这里代表存在新鲜橘子可以感染,修改flagflag = true;//感染这个橘子grid[cur.x + posx[j]][cur.y + posy[j]] = 2;//把这个新的腐烂橘子入队queue.offer(new Orange(cur.x + posx[j], cur.y + posy[j]));}}//上面提到的flag觉得是否自增if(flag){count ++;}}//最后遍历一次数组,查看是狗存在新鲜橘子,因为可能存在对角线情况的新鲜橘子无法被感染boolean done = true;for(int i = 0; i < len1; i++){for(int j = 0; j < len2; j++){if(grid[i][j] == 1){done = false;return -1;}}}return count;}
}
####### 如果你把这题也看懂了,广度优先搜索的大门你以及迈进来一小小步了。上面的俩题都是力扣上面的简单题,如果你有自信,你可以根据笔者上面的解题思路,尝试一下这题中等题扫雷游戏,在这道题的题解区,有笔者的题解,如果有何疑问可以瞅瞅题解,它会给你答案的
public int dfs(TreeNode root){if(root == null){return Integer.MAX_VALUE;}if(root.left == null && root.right == null){return 1;}int leftCount = 0;int rightCount = 0;leftCount = bfs(root.left);rightCount = bfs(root.right);return (leftCount < rightCount ? leftCount : rightCount) + 1;}
具体思路在这里就不讲解啦,等到下次出深度优先搜索的时候再来说
本文发布于:2024-02-01 02:57:15,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170672743633376.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |