111. 二叉树的最小深度
链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
题目描述见链接内容。
要熟悉叶子节点这个概念,叶子节点指的就是没有子节点的节点
解法1:广度优先搜索(BFS)
我这个脑袋,就不太适合去考虑递归的问题,DFS一碰就完蛋,就这么简单的递归,我也总是出错,总是差一点。所以先从BFS下手,和之前求二叉树最大深度的方法基本是一样的,只是在内层循环时添加了一个判断出它是叶子节点就跳出的步骤
var minDepth = function (root) {
if (!root) {
return 0;
}
const queue = [[root]];
let result = 1;
while (queue.length > 0) {
const insideQueue = queue.shift();
const temp = [];
while (insideQueue.length > 0) {
const current = insideQueue.shift();
if (!current.left && !current.right) {
return result;
}
if (current.left) {
temp.push(current.left);
}
if (current.right) {
temp.push(current.right);
}
}
result += 1;
queue.push(temp);
}
return result;
};
- 时间复杂度:
${O(N)}$
- 空间复杂度:
${O(N)}$
- 执行用时:276ms, 在所有JavaScript提交中击败了86%的用户,内存消耗:70.8MB,在所有JavaScript提交中击败了99%的用户
解法2:深度优先搜索(DFS)
没写出来,耐心不够用了,少考虑了只有左子树或者只有右子树的情况,总是去比较Math.min(getDepth(node.left), getDepth(node.right))
了,这样如果只有某一边的子树,就返回了错误的结果
var minDepth = function (root) {
return getDepth(root);
};
function getDepth(node) {
if (!node) {
return 0;
}
if (!node.left) {
return getDepth(node.right) + 1;
}
if (!node.right) {
return getDepth(node.left) + 1;
}
return Math.min(getDepth(node.left), getDepth(node.right)) + 1;
}
- 时间复杂度:
${O(N)}$
,N
是树的节点数 - 空间复杂度:
${O(H)}$
,H
是树的高度,最坏情况为${O(N)}$
,平均情况下树的高度与节点树的对数成正相关${O(log N)}$
- 执行用时:292ms, 在所有JavaScript提交中击败了46%的用户,内存消耗:71.4MB,在所有JavaScript提交中击败了75%的用户