我有一个二元搜索树的对象,它具有以下功能
function BSTAVL() {
/*
Other functions not related to the question
*/
this.inorder = function(cur = this.root) {
var numbers = [];
if (cur != null) {
numbers = this.inorder(cur.left);
numbers.push(cur.value);
numbers = numbers.concat(this.inorder(cur.right));
}
return numbers;
}
this.preorder = function(cur = this.root) {
var numbers = [];
if (cur != null) {
numbers = [cur.value];
numbers = numbers.concat(this.preorder(cur.left));
numbers = numbers.concat(this.preorder(cur.right));
}
return numbers;
}
this.postorder = function(cur = this.root) {
var numbers = [];
if (cur != null) {
numbers = numbers.concat(this.postorder(cur.left));
numbers = numbers.concat(this.postorder(cur.right));
numbers = [cur.value];
}
return numbers;
}
}
var bst = new BSTAVL();
this.root
是一个表示树根的节点对象。
在html文件中我有以下按钮
<button type="button" onclick="Print(bst.inorder);">Inorder</button>
<button type="button" onclick="Print(bst.preorder);">Preorder</button>
<button type="button" onclick="Print(bst.postorder);">Postorder</button>
<br>
<span id="msg"></span>
此功能按预期工作。
function PrintInorder() {
var numbers = bst.inorder();
msg.innerHTML = numbers.join(', ')
}
现在这就是问题发生的地方,这个Print
函数返回一个空数组,当我跟踪它时函数内的this.root
为null,而在实例bst
中它不是
function Print(traversal) {
var numbers = traversal();
msg.innerHTML = numbers.join(', ');
}
我想要的只是一个Print
函数接受一个函数,执行它然后将结果数字打印到页面而不是写三个单独的相同函数PrintInorder
,{{1} }和PrintPreorder
我不明白为什么会这样。我正在传递PrintPostorder
,因此传递的函数必须具有实例bst.inorder
的根(this.root
),但它只是null。
答案 0 :(得分:1)
您可以定义函数以接受函数作为第一个参数,并将被调用函数的上下文作为第二个参数:
function Print(myFn, context) {
myFn.call(context, context.root);
}
然后调用该函数,您可以传递相应的参数:
<button type="button" onclick="Print(bst.inorder, bst);">Inorder</button>