使用BFS时N元树的最大深度

时间:2019-01-25 23:40:03

标签: javascript algorithm data-structures tree breadth-first-search

要获取一棵树的最大深度,下面的代码是正确的答案。

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/

1 个答案:

答案 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));