#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
в качестве второго параметра вызова функции.