[二叉树专题]力扣111二叉树的最小深度

提示:

  1. 树中节点数的范围在 [0, 105] 内

  2. -1000 <= Node.val <= 1000

思路


题目要求二叉树的最小深度,首先递归遍历整个二叉树还是一样的,然后我们需要考虑几种情况:

1.左右子节点都为空

这个时候我们已经遍历到二叉树的叶子节点了,那么我们直接返回1,因为当前节点的高度就为1

2.左子节点不为空或右子节点不为空或都不为空

这个情况我们需要取当前节点的非空子节点和min_depth的较小值

下面我们看代码

代码


主函数中直接返回travel函数的返回值

class Solution {

public:

int minDepth(TreeNode* root) {

return travel(root);

}

};

在travel函数中,需要把出口条件写清楚,首先是如果根节点为空,则直接返回0,因为这是一颗空树,深度为0

int travel(TreeNode* root) {

if(root == nullptr) {

return 0;

}

}

然后是对于思路中讨论的情况的实现

int travel(TreeNode* root) {

if(root == nullptr) {

return 0;

}

if(root->left == nullptr && root->right == nullptr) {

return 1;

}

int min_depth = INT_MAX;

if(root->left != nullptr) {

min_depth = min(travel(root->left), min_depth);

}

if(root->right != nullptr) {

min_depth = min(travel(root->right), min_depth);

}

}

这里要注意int min_depth = INT_MAX这里是把min_depth的值赋了一个最大值,而赋最大值的目的就是为了在后面与非空子节点的深度取较小值时能先取到子节点深度的值

下面我绘制了一幅图描述代码执行题目示例1的过程

请添加图片描述

首先从根节点进入,根节点非空,判断子节点,左右子节点都非空,分别递归求解左右子节点的深度与min_depth之间的较小值

并且先是左子节点的深度与min_depth取较小值,因为min_depth的初始值是int类型最大值,所以肯定取的是左子节点的深度的值,那么其实这里min_depth的值就变成了左子节点的深度与右子节点的深度二者之间的较小值

然后分别是左右子节点递归求解深度,到了叶子结点就会直接返回高度1,而非叶子结点是怎么向上一层递归返回值的呢?

就需要travel函数中的最后一行代码,也就是非叶子结点比较完子节点的深度和min_depth的值之后,需要返回min_depth的值并且+1,+1是表示当前层的高度为1

int travel(TreeNode* root) {

if(root == nullptr) {

return 0;

}

if(root->left == nullptr && root->right == nullptr) {

return 1;

}

int min_depth = INT_MAX;

if(root->left != nullptr) {

min_depth = min(travel(root->left), min_depth);

}

if(root->right != nullptr) {

min_depth = min(travel(root->right), min_depth);

}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
droid开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值