前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
这题值得注意的一点就是,最小深度。 什么是最小深度呢? 根节点到叶子结点(没有子节点的节点)距离。题目中其实说的也很清晰。
递归解法
怎么说呢,递归三部曲呗
- 确定递归的参数和返回值
- 递归结束的条件
- 单层递归的逻辑
递归就是这三句话,把每一步都考虑清楚了,写递归就不会出错
确定递归的参数和返回值
我们一想,递归的目的是干啥的?不就为了计算二叉树的深度?那返回值不就是个int类型的数据? 那参数呢?我们每次要传入什么给这个递归函数?当然是左右子树了。所以递归函数如下
public int minDepth(TreeNode root){}
递归结束的条件
当节点为空的时候代表已经到头了,所以如下为递归结束
if (root == null) { return 0; }
确定单层递归的逻辑
这里的有个注意点:当左子树为空的时候,二叉树的最小深度不是为1哦。
因为题目说了最小深度是根节点到叶子结点的最小距离,它都为空了它哪里有叶子结点呢?
所以如果二叉树的左子树为空,那么最小深度就应该去判断右子树,看根节点到右子树叶子节点的距离
int leftDepth = minDepth(root.left); int rightDepth = minDepth(root.right); if (root.left == null) { return rightDepth + 1; } if (root.right == null) { return leftDepth + 1; } // 左右结点都不为null return Math.min(leftDepth, rightDepth) + 1;
完整代码如下: 前面的一些细节已经说清楚了,完整代码也可以很好的理解了!
class Solution { /** * 递归法,相比求MaxDepth要复杂点 * 因为最小深度是从根节点到最近**叶子节点**的最短路径上的节点数量 */ public int minDepth(TreeNode root) { if (root == null) { return 0; } int leftDepth = minDepth(root.left); int rightDepth = minDepth(root.right); if (root.left == null) { return rightDepth + 1; } if (root.right == null) { return leftDepth + 1; } // 左右结点都不为null return Math.min(leftDepth, rightDepth) + 1; } }