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
就能获得节点的数量。既然,数据的结构为 树
目标值又与 深度
有关,很自然就能想到使用 递归
来解决此类问题。
那么求二叉树的最小深度,使用 递归
要怎么做呢?
这主要分为以下几个步骤:
- 我们先要处理一些边界情况,如下所示:
- 当前节点为
null
,则上一个节点到当前节点的深度为0
- 当前节点为叶子节点(没有左右孩子),则上一个节点到当前节点的深度为
1
- 当前节点为
- 如有左孩子,则继续向下找到左孩子最小的深度
- 如有右孩子,则继续向下找到右孩子最小的深度
- 直到遍历完所有的叶子节点,返回最小的深度
图解算法
此处以下图所示的树作为例子:
- 通过递归找到根节点
3
的左孩子的最小深度为2
,如下图所示:
- 根节点
3
的右孩子最小深度为2
。会讲15
和7
这两个叶子节点的路径都遍历到
- 最终找到了所有叶子节点的路径,经过比较可得到最小的深度为
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);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~