Поиск ошибки в моем алгоритме определения ширины древовидного уровня в es6

#javascript #algorithm #ecmascript-6 #tree

#javascript #алгоритм #ecmascript-6 #дерево

Вопрос:

Я практикуюсь в решении алгоритмической задачи, и мне нужна помощь в поиске ошибки в моем коде.

— Указания По заданию корневого узла дерева верните массив, где каждый элемент равен ширине дерева на каждом уровне.

Я пытался запускать тестовые примеры на нем, а также запускать его в JSBin, но безуспешно. Получение этой ошибки при запуске test: TypeError: undefined невозможно повторить

 // my node class
class Node {
    constructor(data) {
    this.data = data;
    this.children = [];
    }

    add(data) {
        this.children.push(new Node(data));
    }
};

function levelWidth(root) {
    const store = [];
    const widths = [0];
    if(root){
        store.push(root);
        store.push('stop');
    }
    while(store.length > 1){
        const value = store.shift();
        if(value === 'stop'){
            widths.push(0);
            store.push(stop);
        }
        else {
            store.push(...value.children);
            widths[widths.length - 1]  ;
        }
  }
  return widths;
}
  

При запуске

     expect(levelWidth(root)).toEqual([1, 3, 2]);
  

Я ожидаю получить массив [1,3,2], но вместо этого получаю TypeError: undefined не повторяется для

     store.push(...value.children);
  

Насколько я вижу, я правильно использую оператор spread?

Комментарии:

1. stop не определено, например, при вводе store.push(stop); .

2. Да! Stop должен быть ‘stop’. Это маркер, указывающий, когда достигнут конец уровня.

Ответ №1:

Ваша текущая ошибка вызвана тем, что переменная stop не определена; т. е. ваше выражение store.push(stop); ссылается на неопределенную переменную stop .

Закомментируйте эту строку, и эта конкретная ошибка больше не является проблемой:

 // my node class
class Node {
  constructor(data) {
    this.data = data;
    this.children = [];
  }

  add (data) {
    this.children.push(new Node(data));
  }
};

function levelWidth (root) {
  const store = [];
  const widths = [0];
  if (root) {
    store.push(root);
    store.push('stop');
  }
  while (store.length > 1) {
    const value = store.shift();
    if (value === 'stop') {
      widths.push(0);
      // store.push(stop);
    }
    else {
      store.push(...value.children);
      widths[widths.length - 1]  ;
    }
  }
  return widths;
}
  

Комментарии:

1. Спасибо! Старое «забыл кавычки вокруг моего значения». Мои тестовые примеры сейчас проходят.