要获取一棵树的最大深度,下面的代码是正确的答案。
var maxDepth = function(root) {
if (!root) {
return 0
}
let depth = 0;
let arr=[root];
while (arr.length) {
for (let i=0;i<arr.length;i++) {
let curr=arr.shift();
arr.push(...curr.children);
}
depth++;
}
return depth;
};
但是,如果我在for循环中使用arr.length而不是使用“ let arrlength = arr.length;”并使用arrlength,这将是一个错误的答案... 我可以知道为什么吗?我说不出任何区别。非常感谢!
{{1}}
可以在这里进行测试: https://leetcode.com/problems/maximum-depth-of-n-ary-tree/
答案 0 :(得分:1)
let curr = arr.shift()
从数组中删除第一个元素,并将其分配给curr
。
arr.push(...curr.children)
将所有子项添加到数组的末尾。
这两个操作均会更改数组长度,并且测试i < arr.length
每次都会使用当前长度。但是循环仅应处理原始数组元素。 arrlength
包含循环之前数组的原始长度。修改数组后它不会改变,因此循环将操作正确的次数。
如果您在循环之前制作了.length
的副本,并在其上进行了循环而不是修改要循环的数组,则可以在循环中使用arr
。
var maxDepth = function(root) {
if (!root) {
return 0
}
let depth = 0;
let arr = [root];
while (arr.length) {
let copy = [...arr];
arr.splice(0, arr.length);
for (let i = 0; i < copy.length; i++) {
let curr = copy[i];
arr.push(...curr.children);
}
depth++;
}
return depth;
};
const tree = {
value: 1,
children: [{
value: 3,
children: [{
value: 5,
children: []
}, {
value: 6,
children: []
}]
},
{
value: 2,
children: []
},
{
value: 3,
children: []
}
]
};
console.log(maxDepth(tree));