我正在创建一个程序来代表javascript中的二叉搜索树。我想要的是一种创建一个公共树节点的方法,其中ptrs(左,右)都为null。这是我写的代码:
var BST = function(data) {
if (data === null || data === undefined){
this.data = null;
this.left = null;
this.right = null;
}
else{
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
};
BST.prototype.insert = function(data) {
if (this.data === null){
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
else if (data < this.data)
this.left.insert(data);
else if (data > this.data)
this.right.insert(data);
};
BST.prototype.inOrder = function(func) {
if (this.data !== null) {
this.left.inOrder(func);
func(this.data);
this.right.inOrder(func);
}
};
在这里,我想为所有空指针分配一个空节点(如if(data === null || data === undefined)
条件中所定义)。但是对于每个空节点,我必须创建表示相同数据的新节点。
有没有办法分配给空节点的公共实例?
我使用空节点而不是仅使用
else{
this.data = data;
this.left = null;
this.right = null;
}
是在调用inOrder
方法时,在到达left or right = null
的节点时,它会提供TypeError
,因为它会尝试运行 null.inOrder(func);
,{{1}转换为this.left
。
解决这个问题的方法是修改null
函数,这将导致每个语句周围的许多条件,即不是一个非常优雅的实现。
我也可以在对象的原型之外定义inOrder
,并使它以树为参数,即inOrder
,但我不想这样做。
此外,作为代码的第二个改进,请考虑inOder(tree,func)
方法;在insert
案件中:
null
因为我必须覆盖每个条目,所以我想通过以下方式完成这个节点的重新分配:
if (this.data === null){
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
我知道这对前者的实施效率较低,但它仍然更简洁。那么有什么方法可以这样做吗?
答案 0 :(得分:1)
是的,在这种情况下,您可以使用常量实例,因为所有空节点都相同,并且没有不同的引用(如“父”属性)。要创建这样的常量,您需要一个存储它的地方;可以是(私人)变量,也可以是
BST.emptyleaf = new BST(null);
你也可以使用单身人士模式:
function BST(data) {
if (data === null || data === undefined) {
if (BST.emptyleaf)
return BST.emptyleaf; // singleton instance if available
this.data = null;
this.left = null;
this.right = null;
BST.emptyleaf = this; // else create it for re-use
} else {
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
}
答案 1 :(得分:1)
但是对于每个空节点,我必须创建表示相同数据的新节点。有没有办法分配给空节点的公共实例?
是的,但这会破坏您的代码。想一想:当您在该节点实例上调用insert
方法时会发生什么? ...
至于第二个问题,您无法使用当前模型进行优化。没有替换就地对象(there is in C#)。
我认为您当前的代码还可以,但我个人坚持使用更简单的模型,例如
var BST = function(data) {
this.insert(data);
};
BST.prototype.insert = function(data) {
if (typeof this.data == 'undefined') {
this.data = data;
} else if (data < this.data) {
if (!this.left) {
this.left = new BST();
}
this.left.insert(data);
} else if (data > this.data) {
if (!this.right) {
this.right = new BST();
}
this.right.insert(data);
}
};
BST.prototype.inOrder = function(func) {
if (typeof this.data != 'undefined') {
this.left && this.left.inOrder(func);
func(this.data);
this.right && this.right.inOrder(func);
}
};
请注意,这完全消除了对nullNode
的需求,因为 - 嘿! - 它的JavaScript,所以为什么不使用像undefined
这样精彩的东西和动态对象扩展。