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

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

输出:2

示例2:

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

输出:5

提示:

  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) {

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

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)


完整版面试题资料免费分享,只需你点赞支持,动动手指点击此处就可免费领取了

前端实习面试的套路


回顾项目

往往在面试时,面试官根据你简历中的项目由点及面地展开问答,所以请对你做过的最好的项目进行回顾和反思。回顾你做过的工作和项目中最复杂的部分,反思你是如何完成这个最复杂的部分的。

面试官会重点问你最复杂的部分的实现方法和如何优化。重点要思考如何优化,即使你项目中没有对那部分进行优化,你也应该预先思考有什么优化的方案。如果这部分答好了,会给面试官留下很不错的印象。

重点在于基础知识

这里指的基础知识包括:前端基础知识和学科基础知识。

前端基础知识:html/css/js 的核心知识,其中 js 的核心知识尤为重要。比如执行上下文、变量对象/活动对象(VO/AO)、作用域链、this 指向、原型链等。

学科基础知识:数据结构、计算机网络、算法等知识。你可能会想前端不需要算法,那你可能就错了,在大公司面试,面试官同样会看重学生这些学科基础知识。
你可能发现了我没有提到React/Vue这些框架的知识,这里得说一说,大公司不会过度的关注这方面框架的知识,他们往往更加考察学生的基础。
这里我的建议是,如果你至少使用或掌握其中一门框架,那是最好的,可以去刷刷相关框架的面试题,这样在面试过程中即使被问到了,也可以回答个 7788。如果你没有使用过框架,那也不需要太担心,把重点放在基础知识和学科基础知识之上,有其余精力的话可以去看看主流框架的核心思想。

计算机网络、算法等知识。你可能会想前端不需要算法,那你可能就错了,在大公司面试,面试官同样会看重学生这些学科基础知识。
你可能发现了我没有提到React/Vue这些框架的知识,这里得说一说,大公司不会过度的关注这方面框架的知识,他们往往更加考察学生的基础。
这里我的建议是,如果你至少使用或掌握其中一门框架,那是最好的,可以去刷刷相关框架的面试题,这样在面试过程中即使被问到了,也可以回答个 7788。如果你没有使用过框架,那也不需要太担心,把重点放在基础知识和学科基础知识之上,有其余精力的话可以去看看主流框架的核心思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值