LeetCode 二叉树的最小深度

175 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

一、题目描述:

111. 二叉树的最小深度 - 力扣(LeetCode)

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

image.png

输入: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。

范文参考:

在求二叉树最大深度的基础上做一点点修改 - 二叉树的最小深度 - 力扣(LeetCode)