我对有序树遍历的第一个解决方案是利用递归函数调用的返回值:
BST.prototype.inOrder = function(node, array){
if(!node){ return []; }
if(!array){ array = []; }
return this.inOrder(node.left).concat([node.val], this.inOrder(node.right))
}
但后来我看到它也可以用下面的代码解决,我对“数组”值是如何被持久化感到困惑的。
BST.prototype.inOrder = function(node, array){
if(!node){ return []; }
if(!array){ array = []; }
this.inOrder(node.left, array);
array.push(node.val);
this.inOrder(node.right, array)
return array
}
当第一个递归函数调用返回时,它是否覆盖了该函数范围内的数组值?为什么要这样做?
最佳答案
这是一个重载函数,在第一次调用时将在没有第二个参数的情况下调用,在这种情况下,变量会用一个空数组初始化。一个更好的写法可能是
BST.prototype.appendInOrder = function(node, array) {
if (!node) return;
this.appendInOrder(node.left, array);
array.push(node.val);
this.appendInOrder(node.right, array);
}
BST.prototype.inOrder = function(node) {
var array = [];
this.appendInOrder(node, array);
return array;
}
关于JavaScript 作用域(递归)——参数值在没有显式声明的情况下被返回值覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44442592/