题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
对递归的理解还是不够透彻,下文还是个人的思路分析【完全不建议参考,递归的学习过程心路历程会发生很多质的变化,想要学习递归,更应该看一个可以将其使用非常熟练的作者的思路分析,也希望有一天我能成为那类作者之一】还希望大佬能够对我的分析不对的地方提出一些建议,谢谢!
function minDepth(root: TreeNode | null): number {
if(root === null){
return 0;
}
if(root.left === null && root.right === null){
return 1;
}
let min: number = Number.MAX_VALUE;
if(root.left !== null){
min = minDepth(root.left);
}
if(root.right !== null){
min = Math.min(minDepth(root.right), min);
}
return 1+min;
};
1. 如何判断是否到了叶子节点?
首先,叶子节点是左右子叶均为空。
2. 遇到这样的树,怎么办?
每个节点都会判断它自己左右子树的最小深度,所以我们并不用在意这棵树长什么形状。在3的节点就会直接判断出来左右子树的最小深度。
将min取最大整数是因为:当一颗节点左右子节点都不为空时,计算左子节点时,会直接将min的值给覆盖掉,这时不论我们为min赋什么初始值都无所谓。左子节点为空、右子节点不为空时,计算方法是比较右子节点的最小深度和min的值,如果我们为min赋的值为0时,左子节点为空,并是不会修改min的值的,这时不论右子节点的最小深度为多少,都会被min的初始值0给覆盖,显然是不正确的。所以不因该对min赋予较小的数字,而应该是较大的数字,这样我们在比较大小时,min中保存的就是真实的右子节点的最小深度了。
总结:分析递归时,函数功能化,minDepth函数认为它就是能直接得到节点的最小深度。只分析根节点及其左右子节点的各种特殊情况,不去考虑子节点的子节点的情况。