持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
一、题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
提示:
- 树中节点数的范围在 [0, 105] 内
- -1000 <= Node.val <= 1000
二、思路分析:
首先来讲一下bfs广度优先在js中的实现 js中用队列先进先出来实现广度优先 初始根节点入队 每次循环shift一个队头元素,并且将队头元素的所有孩子都入队 如此循环,即可完成广度优先遍历
本题利用广度优先遍历,一层一层地寻找,找到的第一个叶子节点就是二叉树的最小深度
三、AC 代码:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var minDepth = function(root) {
if(!root){return 0}
const q=[[root,1]]
while(q.length){
const [n,l]=q.shift()
if(!n.left&&!n.right){
return l;
}
if(n.left)q.push([n.left,l+1])
if(n.right)q.push([n.right,l+1])
}
};
总结
其实思路完全可以借鉴求最大深度,直接把max改成min,但是前提是当前递归的节点左右子树均存在的时候
但凡有其中节点没有左/右孩子,这时候计算的深度就要以当前节点的最大深度为准了,直接用max的思路就好。
没有左/右孩子特殊情况如下图所示。这时候的深度是2,而不是0。