javascript - 未捕获的类型错误:无法读取属性“插入”
问题描述
无法找到下面的代码有什么问题,让我知道问题出在哪里...我正在尝试构建二叉搜索树但无法构建。
function BinarySearchTree(){
var Node = function(key){
this.key = key;
this.left = null;
this.right = null;
};
var root = null;
}
//Inserting a Key into a tree
this.insert = function(key){
var newNode = new Node(key);
if(root === null){
root = newNode;
}else{
insertNode(root, newNode);
}
};
var insertNode = function(node, newNode){
if(newNode.key < node.key){
if(node.left === null){
node.left = newNode;
}else{
insertNode(node.left, newNode);
}
}else{
if(node.right === null){
node.right = newNode;
}else{
insertNode(node.right, newNode);
}
}
};
var tree = BinarySearchTree();
tree.insert(11);
解决方案
评论者提到了导致挂断的代码的几个问题。首先,您在or函数this
之外使用,因此将被评估为引用全局对象。此外,当您分配给变量时,您不会调用构造函数,因此如果您要,它将返回值。constructor
prototype
this
BinarySearchTree
tree
console.log(tree)
undefined
那么如何解决你的问题呢?
首先,您可以在BinarySearchTree
(以下称为 BST)定义中添加检查以返回对象的实例,以防您忘记new
关键字。
if (!(this instanceof BinarySearchTree)) {
return new BinarySearchTree();
}
其次,您希望将Node
构造函数和root
变量绑定到 BST 对象,方法是用var
andthis.Node
替换this.root
。现在您可以稍后在prototype
您将定义的各种功能中访问它们。
第三,如前所述,重构您对insert
函数的定义,如下所示:
BinarySearchTree.prototype.insert = function(){}
当然,用适当的代码填写函数。对 做同样的事情insertNode
。
BinarySearchTree.prototype.insertNode = function(){}
我并不是说代码会起作用,但这应该会创建您需要的原型继承,以便您的树作为对象运行。
重构
function BinarySearchTree(){
if (!(this instanceof BinarySearchTree)) {
return new BinarySearchTree();
}
this.Node = function(key){
this.key = key;
this.left = null;
this.right = null;
};
this.root = null;
}
//Inserting a Key into a tree
BinarySearchTree.prototype.insert = function(key){
var newNode = new this.Node(key);
if(this.root === null){
this.root = newNode;
}else{
this.insertNode(this.root, newNode);
}
};
BinarySearchTree.prototype.insertNode = function(node, newNode){
if(newNode.key < node.key){
if(node.left === null){
node.left = newNode;
}else{
this.insertNode(node.left, newNode);
}
}else{
if(node.right === null){
node.right = newNode;
}else{
this.insertNode(node.right, newNode);
}
}
};
var tree = BinarySearchTree();
tree.insert(11);
推荐阅读
- flutter - 在 Flutter 中创建私有路由
- python - 为什么 Python3 str(bytes) 转换为文字字符串 b'
' - amazon-web-services - 将 aws route53 设置为 cname 目标
- c# - 将字段添加到 JSON 数组 C#
- swift - 如何在使用项目模板生成的 Kitura 项目中设置日志记录级别?
- c - puts and printf do not give out full text (text containing CJK characters), when the text is read from a local file, on Windows, MSVC
- error-handling - Inno setup - 如何设置安装程序“以非管理员身份运行”?
- matlab - 在 matlab m 文件中添加断点会使其运行速度变慢吗?
- javascript - 在 JS 中单击第一个按钮后添加第二个按钮
- python - 如何使用地图在一行中根据用户输入打印数字的倍数