为什么此BST验证功能因此javascript树实现而失败?

时间:2018-08-07 01:39:01

标签: javascript binary-search-tree prototypal-inheritance

我试图了解如何使用原型继承(即使用Object.create()而不是new关键字在js中创建对象。我创建了一个节点类,目的是使用以下实现创建树形数据结构:

Object.prototype.extend = function(extension) {
    var hasOwnProperty = Object.hasOwnProperty;
    var object = Object.create(this);

    for(var property in extension) {
      if (hasOwnProperty.call(extension, property) ||
              typeof object[property] === "undefined")
                    object[property] = extension[property];
    }

    return object

}

const node =  {
    create: function (value, left=null, right=null) {
      return this.extend({
        value: value,
        left: left,
        right: right,
      })
    },
    insertLeft: function(value){
        this.left = this.create(value);
        return this.left;
    },
    insertRight: function(value) {
        this.right = this.create(value);
        return this.right;
    }
}

我从博客post获得的extend函数解释了原型继承。

然后我提供了一个功能来验证以这种方式实现的BST:

validateBST = function (root) {
    if (root === null) return true
    return (function validate(root, min=-Infinity, max=Infinity) {
      if (root === null) return true
      if (root.val <= min || root.val >= max) return false
      return validate(root.left, min, root.val) && validate(root.right, root.val, max)
    })(root)
}

我在create对象中使用node方法初始化树。

let tree = node.create(5, node.create(1), node.create(4, node.create(3), node.create(6)));

树变量的输出;

{ value: 5,
  left: { value: 1, left: null, right: null },
  right:
   { value: 4,
     left: { value: 3, left: null, right: null },
     right: { value: 6, left: null, right: null } } }

这是无效的BST,但是我的函数返回true,为什么?

1 个答案:

答案 0 :(得分:2)

这是因为validateBST函数假定根参数将具有属性“ val”,但是您正在传递具有属性“ value”的节点对象。现在为什么返回true,因为root.val将是未定义的,并且永远不会输入唯一返回false的'if'语句。并且,执行将一直进行到它打到树上,而root所在的树为null并返回true为止。 您唯一需要做的更改就是在validateBST()函数中将“ root.val”替换为“ root.value”。