「前端刷题」111. 二叉树的最小深度

100 阅读1分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。

题目

链接:leetcode-cn.com/problems/mi…

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

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

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

示例 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

思路1 BFS

1. 解题思路

  1. 求最小深度,考虑使用广度优先遍历
  2. 在广度优先遍历过程中,遇到叶子节点,停止遍历,返回节点层级

解题步骤:

  1. 广度优先遍历整棵树,并记录每个节点的层级
  2. 遇到叶子节点,返回节点层级,停止遍历

2. 代码实现

  • JavaScript
  • TypeScript
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])
    }
};
function minDepth(root: TreeNode | null): number {
    if(!root) { return 0; }
    const queue: [TreeNode, number][] = [[root, 1]];
    while(queue.length) {
        const [n, l] = queue.shift();
        if(!n.left && !n.right) {
            return l
        }
        if(n.left) queue.push([n.left, l + 1])
        if(n.right) queue.push([n.right, l + 1])
    }
};

解法2:

function minDepth(root: TreeNode | null): number {
    if (!root) return 0;
    const queue = [root];
    let deep = 1;
    while (queue.length) {
        const levelSize = queue.length;
        for (let i = 0; i < levelSize; i++) {
            const n = queue.shift();
            if (!n.left && !n.right) return deep;
            n.left && queue.push(n.left);
            n.right && queue.push(n.right);
        }

        if (queue.length) deep += 1;
    }
    return deep;
};

3. 复杂度分析

时间复杂度O(n), 空间复杂度O(n)

思路2 DFS

1. 解题思路

新建一个变量,记录最小深度
深度优先遍历整棵树,并记录每个节点的层级,同时不断刷新最小深度这个变量
遍历结束返回最小深度这个变量

2. 代码实现

  • JavaScript
  • TypeScript
function minDepth(root) {
    if (!root) return 0;
    let deep = Infinity;
    const dfs = (n, l) => {
        if (!n) return;
        if (!n.left && !n.right) {
            deep = Math.min(deep, l);
        }
        n.left && dfs(n.left, l + 1);
        n.right && dfs(n.right, l + 1);
    }
    dfs(root, 1);
    return deep;
};
function minDepth(root: TreeNode | null): number {
    if (!root) return 0;
    let deep = Infinity;
    const dfs = (n, l) => {
        if (!n) return;
        if (!n.left && !n.right) {
            deep = Math.min(deep, l);
        }
        n.left && dfs(n.left, l + 1);
        n.right && dfs(n.right, l + 1);
    }
    dfs(root, 1);
    return deep;
};

3. 复杂度分析

时间复杂度O(n), 空间复杂度O(n)