前端算法(66)

80 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

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

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

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

输入: root = [2,null,3,null,4,null,5,null,6]
输出: 5

题目解析

思路一

我们先定义一个列表,然后将每一层节点都放进去这个列表中,再去循环,在开始前需要判断当前的数据是否为空,为空做出相应的擦走哦,然后进行循环列表,记录下当前列表长度,当前列表长度就是当前层的节点数,通过遍历当前层的节点,然后对节点进行操作,其中需要判断一下左右节点是否为空,如果为空则表示到底了叶子节点,需要返回路径上的节点数,然后再进行判断当前左节点和右节点,对其做出对应的操作,每遍历一次相对应的把记录层数自增1,最后返回自增的层数

/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function(root) {
    const p = [];
    let step = 0;
    if(root !== null){
        p.push(root);
        step++;
    }
    while(p.length > 0) {
        const size = p.length;
        for(let i = 0; i < size; i++){
            const cur = p.shift();
            if(cur.left === null && cur.right === null){
                return step;
            }
            if(cur.left !== null){
                p.push(cur.left);
            }
            if(cur.right !== null){
                p.push(cur.right);
            }
        }
        step++;
    }
    return step;
};

思路二

我们这里使用递归进行实现,首先判断当前数据是否为空,为空则返回当前数据层数为0,如果不为空则继续往下走,将数据的左节点和右节点进行递归,最后通过三则表达式进行判断出当前的深度,如果左右子树有一个没有,最小深度是左子树加右子树+ 1, 如果左右子树都有,最小深度是左子树或者右子树之中比较小的那个深度 + 1

/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function(root) {
    if(!root) return 0;
    let m1 = minDepth(root.left);
    let m2 = minDepth(root.right);
    return root.left === null || root.right === null ? m1 + m2 + 1 : Math.min(m1, m2) + 1
};