力扣【广度搜索专题】👊 559. N 叉树的最大深度

156 阅读2分钟

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

题目链接

559. N 叉树的最大深度 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

测试用例

示例 1:

image.png

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

条件限制

树的深度不会超过 1000 。
树的节点数目位于 [0, 104] 之间。

题目分析

n叉树不同于二叉树的地方在于,前者的节点的子节点的最大数量为 n,即不限制个数。换个说法,二叉树其实就是特殊的 n 叉树

题目需要我们求 n 叉树的最大深度,推荐的做法就是对树进行广度遍历,遍历当前层每一个节点,然后将这个节点对应的子节点,一个个添加到下一层待遍历的节点集合里。等当前层的节点遍历完成后,对下一层的节点重复如上的操作。同时,需要引入一个 deep 遍历,每次遍历下一层的时候,deep++

代码实现

var maxDepth = function(root) {
    if (root == null) return 0;
    let arrs = [root],
        deep = 0;
    while (arrs.length > 0) {
        deep++;
        let len = arrs.length;
        for (; len > 0; len--) {
            let curr = arrs.shift();
            arrs.push(...curr.children);
        }
    }
    return deep;
};

image.png

解法2

n 叉树的递归遍历,和二叉树的递归操作,大同小异,不过是将二叉树对左右子节点的递归执行,修改为,对 n 叉树的子节点的 for 循环递归操作。同样的,引入 deep 遍历,每次递归操作时,将当前的深度与 deep 比较,然后使用其中最大的一个,更新 deep 的值

var maxDepth = function(root) {
    let deep = 0;
    trave(root, deep);

    function trave(node, d) {
        if (node == null) return;
        d++;
        deep = Math.max(d, deep);
        for (let i = 0; i < node.children.length; i++) {
            trave(node.children[i], d);
        }
    }
    return deep;
};

image.png

对树进行递归遍历,性能看起来要比广度搜索方式更加优秀