LC 111.二叉树的最小深度

111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: 2

示例 2:

输入: root = [2,null,3,null,4,null,5,null,6]
输出: 5

提示:

  • 树中节点数的范围在 [ 0 , 1 0 5 ] [0, 10^5] [0,105]内
  • − 1000 ≤ N o d e . v a l ≤ 1000 -1000 \leq Node.val \leq 1000 −1000≤Node.val≤1000

解法一(BFS+队列)

思路分析:

  1. 依旧对二叉树进行层序遍历,在遍历的过程中,对结点进行判断,第一个出现的叶子节点即为离根节点最近的叶子节点

实现代码如下:

java 复制代码
class Solution {
    public int minDepth(TreeNode root) {
        int ans = 0;
        if (root == null)
            return ans;
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            ++ ans;    // 记录距离
            for (int i = 0; i < size; ++ i) {
                TreeNode node = queue.poll();
                if (node.left == null && node.right == null) {
                    // 找到最近的叶子节点
                    return ans;
                }
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
        }
        return ans;
    }
}

提交结果如下:

解答成功:

执行耗时:2 ms,击败了86.64% 的Java用户

内存消耗:61.6 MB,击败了6.25% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n),辅助队列

解法二(前序求深度递归)

思路分析:

  1. 使用递归来寻找离根节点最近的叶子节点

  2. 思考递归参数,即需要传递二叉树的节点和节点所在层数,且不需要返回值

  3. 对于递归边界条件,即当节点为空时,不需要往下遍历,同时当遍历到叶子节点时,比较是否为最短距离,并结束递归

  4. 递归过程则是,对叶子节点距离根节点的距离作比较,寻找最小距离

实现代码如下:

java 复制代码
class Solution {
    int ans = Integer.MAX_VALUE;
    public int minDepth(TreeNode root) {
        getMinDepth(root, 1);
        if (ans == Integer.MAX_VALUE) return 0;
        return ans;
    }
    private void getMinDepth(TreeNode node, int depth) {
        if (node == null)
            return ;    // 结束遍历
        if (node.left == null && node.right == null) {
            ans = Math.min(depth, ans);        // 记录最小深度
            return ;
        }
        getMinDepth(node.left, depth+1);
        getMinDepth(node.right, depth+1);
    }
}

提交结果如下:

解答成功:

执行耗时:7 ms,击败了63.76% 的Java用户

内存消耗:62 MB,击败了5.02% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

解法三(后序求高度递归)

思路分析:

  1. 对于该题求二叉树的最小深度,即等同于求二叉树根节点到最近叶子节点的高度,因此可以通过后序遍历来求二叉树根节点到最近叶子节点的高度

  2. 首先对递归的参数和返回值进行考虑,因为需要遍历二叉树,所以递归传递参数为二叉树节点,同时需要求高度,所以递归函数返回值为int

  3. 然后思考递归的边界条件,因为从叶子节点返回得到高度,所以对于空节点则直接返回0

  4. 对于递归的过程,则按照后序遍历,先遍历左右子树,然后进行判断得到当前节点的最小高度

    1. 若左子树为null,则返回右子树高度+1

    2. 若右子树为null,则返回左子树高度+1

    3. 若左右子树均不为null,则返回左右子树最小高度+1

实现代码如下:

java 复制代码
class Solution {
    public int minDepth(TreeNode root) {
        return getHeight(root);
    }
    // 后序遍历递归求二叉树节点高度
    private int getHeight(TreeNode node) {
        if (node == null)
            return 0;    // 边界条件 空节点返回0
        // 左
        int leftHeight = getHeight(node.left);
        // 右
        int rightHeight = getHeight(node.right);
        // 获取中 高度
        int height;
        if (node.left != null && node.right == null)
            height = leftHeight+1;
        else if (node.left == null && node.right != null)
            height = rightHeight+1;
        else height = Math.min(leftHeight, rightHeight)+1;
        return height;
    }
}

提交结果如下:

解答成功:

执行耗时:9 ms,击败了37.82% 的Java用户

内存消耗:61.7 MB,击败了7.75% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
相关推荐
萤丰信息2 分钟前
科技赋能智慧园区:解码绿色转型的“数字密码”
java·大数据·人工智能·科技·安全·智慧城市·智慧园区
码农阿豪16 分钟前
远程调试不再难!Remote JVM Debug+cpolar 让内网 Java 程序调试变简单
java·开发语言·jvm
stillaliveQEJ20 分钟前
【JavaEE】Spring AOP(二)
java·spring·java-ee
岁岁种桃花儿27 分钟前
Spring Boot项目核心配置:parent父项目详解(附实操指南)
java·spring boot·spring
YYHPLA30 分钟前
【无标题】
java·spring boot·后端·缓存
木易 士心31 分钟前
加密与编码算法全解:从原理到精通(Java & JS 实战版)
java·javascript·算法
专注于大数据技术栈32 分钟前
java学习--ArrayList
java·学习
编程大师哥35 分钟前
JavaEE初阶的核心组件
java·java-ee
华如锦36 分钟前
MongoDB作为小型 AI智能化系统的数据库
java·前端·人工智能·算法
q***441539 分钟前
C++跨平台开发挑战的技术文章大纲编译器与工具链差异
java·后端