104. 二叉树的最大深度

/**
 * 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;
    }
}

111. 二叉树的最小深度

/**
 * 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++;
        }
    }