首页 > 解决方案 > 未捕获的类型错误:无法读取属性“插入”

问题描述

无法找到下面的代码有什么问题,让我知道问题出在哪里...我正在尝试构建二叉搜索树但无法构建。

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);

标签: javascript

解决方案


评论者提到了导致挂断的代码的几个问题。首先,您在or函数this之外使用,因此将被评估为引用全局对象。此外,当您分配给变量时,您不会调用构造函数,因此如果您要,它将返回值。constructorprototypethisBinarySearchTreetreeconsole.log(tree)undefined

那么如何解决你的问题呢?

首先,您可以在BinarySearchTree(以下称为 BST)定义中添加检查以返回对象的实例,以防您忘记new关键字。

if (!(this instanceof BinarySearchTree)) {
    return new BinarySearchTree();
}

其次,您希望将Node构造函数和root变量绑定到 BST 对象,方法是用varandthis.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);

推荐阅读