我试图了解如何使用原型继承(即使用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
,为什么?
答案 0 :(得分:2)
这是因为validateBST函数假定根参数将具有属性“ val”,但是您正在传递具有属性“ value”的节点对象。现在为什么返回true,因为root.val将是未定义的,并且永远不会输入唯一返回false的'if'语句。并且,执行将一直进行到它打到树上,而root所在的树为null并返回true为止。 您唯一需要做的更改就是在validateBST()函数中将“ root.val”替换为“ root.value”。