「这是我参与2022首次更文挑战的第 27 天,活动详情查看:2022首次更文挑战」
题目链接
559. N 叉树的最大深度 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。
测试用例
示例 1:
输入: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;
};
解法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;
};
对树进行递归遍历,性能看起来要比广度搜索方式更加优秀