我在javascript中从数据结构和算法中找到了这个算法。对于插入方法,有两个对根(current和parent)的引用。我的问题是,为什么我不能将当前和父母都改为this.root?他们都指向this.root。但是,当我这样做时,代码无法正常工作
'use strict';
var BST = function() {
this.root = null;
//embed _Node inside BST so it comes with when BST is created
this._Node = function(data, left, right) {
this.data = data;
this.count = 1;
this.left = left;
this.right = right;
};
this._Node.prototype.show = function() {
return this.data;
};
this._Node.prototype.showCount = function() {
return this.count;
}
};
BST.prototype.insert = function(data) {
//use this data for a new node
var n = new this._Node(data, null, null);
//if root is null, put this new node and its data into root
if (this.root === null) {
this.root = n;
}
else {
//find a child position for this node
var current = this.root;
var parent;
while (true) {
parent = current;
if (data < current.data) {
current = current.left;
if (current === null) {
parent.left = n;
break;
}
}
else {
current = current.right;
if (current === null) {
parent.right = n;
break;
}
}
}
}
};
var nums = new BST();
nums.insert(23);
nums.insert(45);
nums.insert(16);
nums.insert(37);
nums.insert(3);
nums.insert(99);
nums.insert(22);
答案 0 :(得分:2)
current
在整个算法中都没有引用this.root
。
它已初始化为this.root
,但随后会快速重新分配到current = current.left;
或current = current.right;
。从current
开始,this.root
不再是this.root.left
。它可以是this.root.right
或this.root
。
在while循环的下一次迭代中,它将再次被重新分配,但它永远不再是current
,因为它总是被重新分配给parent
的子节点。
this.root
类似,仅在第一次迭代时为parent = current;
。在每次后续迭代中,它由current is no longer
重新分配,并从,
this.root won't be
父 var $row = $("<tr>" + "<td>" + "<div style=\"border-top:3px;padding-top:3px\">" + $("<a>" + result.fileName + "</a>").attr({ href: "/AgencyNotes/OpenFile/" + result.fileName + "/" + result.agencyNoteId }) + "</div>" + "</td>" + "</tr>")
$(temp).children().children().children().children().first().after($row)
this.root`重新分配。
答案 1 :(得分:0)
parent
仅用于保存前一个节点的引用,您创建新节点n
,然后在current
变为null
后在树中找到它的位置,您找到了节点n
的目标位置,您需要将其指定为子节点left
或right
)到parent
节点