Не удается прочитать свойство «push» неопределенного значения при использовании вложенных функций

#javascript #tree #inorder

Вопрос:

Почему работает следующий код

 const inorderTraversal = (root) => {
    let out = []

    const traverse = (node) => {
        console.log(node)
        if (!node) return
        traverse(node.left)
        out.push(node.val)
        traverse(node.right)
    }
    traverse(root)
    return out
};
 

но этот не делает

 const inorderTraversal = (root) => {
    let out = []

    const traverse = (node,arr) => {
        if (!node) return
        traverse(node.left)
        arr.push(node.val)
        traverse(node.right)
    }
    traverse(root,out)
    return out
};
 

Мне нужно изменить алгоритм для нескольких двоичных деревьев, но при отправке массива в качестве параметра вместо глобальной переменной я получаю Cannot read property 'push' of undefined ошибку.

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

1. arr является вторым параметром traverse функции. Когда вы вызываете traverse(node.left) или traverse(node.right) , вы передаете только один единственный аргумент.

2. Вы не передаете arr в качестве второго параметра в traverse(node.left) и traverse(node.right) , это должно быть traverse(node.left, arr) и traverse(node.right, arr)

Ответ №1:

Во втором втором сценарии вы написали traverse(node.right) , но , поскольку ваша traverse функция теперь имеет два параметра, а вы передаете только один, arr он не определен. Затем при вызове рекурсивной функции вы получаете предупреждение об операторе arr.push(node.val) , потому что вы пытаетесь вызвать push метод arr , даже если переменная не определена. Чтобы исправить ошибку, добавьте arr в качестве второго параметра вызова функции.