大家好今天给大家分享下一道 LeetCode 中等难度 的题目[111. 二叉树的最小深度]
题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6] 输出:5
分析
1.根节点到子叶节点的最短距离
2.子叶节点是没有左右子节点的节点
3.返回最短距离
解法
1.递归
2.迭代
解法一:递归
思路
1.终止条件是 没有任何子节点
2.递归的时候,携带每一层的高度,每次递归后h+1
3.需要注意 有子节点的时候再进行递归,否则会报空指针异常
*/
var minDepth = function (root) {
// 初始一个最小知识为无限大
let res = Infinity;
// 当该树为空树时候 为一个特性情况 直接返回0
if (!root) return 0;
// 递归的时候携带高度
function minDep(root, h) {
// 当到达子叶节点 取最小值给res赋值
if (!root.left && !root.right) {
res = Math.min(res, h);
return;
}
// 每次递归高度加一
h = h + 1;
// 需要注意 有子节点的时候再进行递归,否则会报空指针异常
root.left && minDep(root.left, h);
root.right && minDep(root.right, h);
}
minDep(root, 1);
return res;
};
/* 复杂度
时间 O(n)
空间 O(n)
*/
解法二:迭代
思路
1.迭代和递归类似,只是采用的stack来模拟递归
2.stack 中推入 { root:root, h: 1 } 来记录每个节点的值和高度
3.当满足叶子节点的时候 开始更新res
*/
var minDepth = function (root) {
// 初始一个最小知识为无限大
let res = Infinity;
// 当该树为空树时候 为一个特性情况 直接返回0
if (!root) return 0;
const stack = [];
// stack 中推入 { root:root, h: 1 } 来记录每个节点的值和高度
stack.push({ root, h: 1 });
while (stack.length) {
const { root, h } = stack.pop();
// 当满足叶子节点的时候 开始更新res
if (!root.left && !root.right) {
res = Math.min(res, h);
}
root.left && stack.push({ root: root.left, h: h + 1 });
root.right && stack.push({ root: root.right, h: h + 1 });
}
return res;
};
/* 复杂度
时间 O(n)
空间 O(n)
*/
总结
今天这道题是主要是练习递归的使用求最小深度 和 如何使用stack模拟递归求最小深度
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com