力扣第111题-二叉树的最小深度

103 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

前言

力扣第111题 二叉树的最小深度 如下所示:

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

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

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

示例 1:

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

示例 2:

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

一、思路

这一题题目比较短,目标只有一个求树的最小深度路径上节点的数量

虽然目标值是 节点的数量,但是我们只要知道最短路径的长度值,再将长度值 +1 就能获得节点的数量。既然,数据的结构为 目标值又与 深度 有关,很自然就能想到使用 递归 来解决此类问题。

那么求二叉树的最小深度,使用 递归 要怎么做呢?

这主要分为以下几个步骤:

  1. 我们先要处理一些边界情况,如下所示:
    • 当前节点为 null,则上一个节点到当前节点的深度为 0
    • 当前节点为叶子节点(没有左右孩子),则上一个节点到当前节点的深度为 1
  2. 如有左孩子,则继续向下找到左孩子最小的深度
  3. 如有右孩子,则继续向下找到右孩子最小的深度
  4. 直到遍历完所有的叶子节点,返回最小的深度

图解算法

此处以下图所示的树作为例子:

image.png

  1. 通过递归找到根节点 3 的左孩子的最小深度为 2,如下图所示:

image.png

  1. 根节点 3 的右孩子最小深度为 2。会讲 157 这两个叶子节点的路径都遍历到

image.png

image.png

  1. 最终找到了所有叶子节点的路径,经过比较可得到最小的深度为 2(虽然三个路径的深度都为 2),故最小深度路径上的节点数量 3。返回结果 3 即可。

二、实现

实现代码

实现代码与思路中保持一直

给 ret 的默认值设为 Max,是为了保证递归得到的结果可以得到保留
    public int minDepth(TreeNode root) {
        int ret = Integer.MAX_VALUE;

        if (root == null)
            return 0;
        if (root.left == null && root.right == null)
            return 1;
        if (root.left != null)
            ret = Math.min(ret, minDepth(root.left));
        if (root.right != null)
            ret = Math.min(ret, minDepth(root.right));
        return ret + 1;
    }

测试代码

测试代码中 TreeNode1 是一种全为右孩子的特殊情况,可以很好的体现 找到根节点到叶子节点的最小深度 的过程

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(3,
                new TreeNode(9),
                new TreeNode(20, new TreeNode(15), new TreeNode(7)));
        TreeNode treeNode1 = new TreeNode(2,
                null,
                new TreeNode(3, null, new TreeNode(4, null ,new TreeNode(5, null, new TreeNode(6)))));
        new Number111().minDepth(treeNode1);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~