/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//分别获取左子树和右子树的最大的深度 然后选择其中最大的加1就可以
public int maxDepth(TreeNode root) {
if(root==null){
return 0;
}
int left=maxDepth(root.left);
int right=maxDepth(root.right);
return Math.max(left,right)+1;
}
}
/**
* Copyright (C), 2018-2020
* FileName: minDepth111
* Author: xjl
* Date: 2020/7/27 15:14
* Description: 最小树
*/
package Tree;
public class minDepth111 {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public int minDepth(TreeNode root) {
if (root == null) return 0;
//这道题递归条件里分为三种情况
//1.左孩子和有孩子都为空的情况,说明到达了叶子节点,直接返回1即可
if (root.left == null && root.right == null) return 1;
//2.如果左孩子和右孩子其中一个为空,那么需要返回比较大的那个孩子的深度
int m1 = minDepth(root.left);
int m2 = minDepth(root.right);
//这里其中一个节点为空,说明m1和m2有一个必然为0,所以可以返回m1 + m2 + 1;
if (root.left == null || root.right == null) {
return m1 + m2 + 1;
}
//3.最后一种情况,也就是左右孩子都不为空,返回最小深度+1即可
return Math.min(m1, m2) + 1;
}
}
我们先举例⼀下 BFS 出现的常⻅场景好吧, 问题的本质就是让你在⼀幅「图」 中找到从起点 start 到终点 target 的最近距离, 这个例⼦听起来很枯燥, 但是 BFS 算法问题其实都是在⼲这个事⼉,这个⼴义的描述可以有各种变体, ⽐如⾛迷宫, 有的格⼦是围墙不能⾛, 从起点到终点的最短距离是多少? 如果这个迷宫带「传送门」 可以瞬间传送呢?再⽐如说两个单词, 要求你通过某些替换, 把其中⼀个变成另⼀个, 每次只能替换⼀个字符, 最少要替换⼏次?再⽐如说连连看游戏, 两个⽅块消除的条件不仅仅是图案相同, 还得保证两个⽅块之间的最短连线不能多于两个拐点。 你玩连连看, 点击两个坐标, 游戏是如何判断它俩的最短连线有⼏个拐点的?再⽐如……净整些花⾥胡哨的, 这些问题都没啥奇技淫巧, 本质上就是⼀幅「图」 , 让你从⼀个起点, ⾛到终点, 问最短路径。 这就是 BFS 的本质。
// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
Queue<Node> q; // 核⼼数据结构
Set<Node> visited; // 避免⾛回头路
q.offer(start); // 将起点加⼊队列
visited.add(start);
int step = 0; // 记录扩散的步数
while (q not empty) {
int sz = q.size();
/* 将当前队列中的所有节点向四周扩散 */
for (int i = 0; i < sz; i++) {
Node cur = q.poll();
/* 划重点: 这⾥判断是否到达终点 */
BFS 算法解题套路框架
50if (cur is target)
return step;
/* 将 cur 的相邻节点加⼊队列 */
for (Node x : cur.adj())
if (x not in visited) {
q.offer(x);
visited.add(x);
}
} /* 划重点: 更新步数在这⾥ */
step++;
}
}