0
点赞
收藏
分享

微信扫一扫

JavaScript算法18- 二叉树的最小深度(leetCode:111)

二叉树的最小深度


文章目录

一、题目

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

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

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

示例
在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:2

二、题解

方法1(递归)

  • 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点
  • 当 root 节点左右孩子都为空时,返回 1
  • 当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度
  • 当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值
/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function (root) {
    if (!root) { return 0 }
    let minLeft = minDepth(root.left) 
    let minRight = minDepth(root.right) 
    // 其中一个节点为空,说明minLeft 和minRight 有一个必然为0,所以可以返回minLeft + minRight + 1;
    return root.left == null || root.right == null ? minLeft + minRight + 1 : Math.min(minLeft, minRight) + 1;    
};

在这里插入图片描述

方法2(深度优先遍历)

用深度优先遍历,要遍历所有节点,拿到所有叶子节点的层级

/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function (root) {
    let res
    const dfs = (n,l) => {
        if (!n) return
        if (!n.left && !n.right) {
            res = res? Math.min(res,l) : l
        }
        dfs(n.left, l + 1)
        dfs(n.right, l + 1)
    }
    dfs(root, 1)
    return res ? res : 0
};

在这里插入图片描述

方法3(广度优先遍历)

  • 广度优先遍历整棵树,并记录每个节点的层级
  • 遇到叶子结点,返回节点层级,停止遍历 — 不用遍历每一个节点
var minDepth = function(root) {
    if(!root) return 0
    const q = [[root,1]];
    while (q.length > 0) {  
        const [n,level] = q.shift();
        if (!n.left && !n.right) {
            // 遇到第一个叶子节点
            return level        
        }            
        n.left && q.push([n.left, level+1])
        n.right && q.push([n.right, level+1])
    }
};

在这里插入图片描述

举报

相关推荐

0 条评论