我正在尝试构建这个简单的Javascript二进制搜索树。我只是为树创建了addItem方法,但似乎没有项添加到树中。我已将addItem方法划分为其他几个方法,以确保正确传递树引用而没有任何错误。我认为问题发生在addNode递归调用中。
下面是给定的代码:
class Node{
constructor(value){
this.value=value;
this.left=null;
this.right=null;
}
show(){
console.log(this.value);
}
}
class BST{
constructor(){
this.root=null;
}
addNode(node, item){
if(node==null){
node=new Node(item);
}
else if(item<=node.value){
this.addNode(node.left, item);
}
else {
this.addNode(node.right, item);
}
}
addFunc(tree, item){
this.addNode(tree.root, item);
}
addItem(item){
this.addFunc(this, item);
}
}
let bst = new BST();
bst.addItem(5);
bst.addItem(43);
bst.addNode(12);
console.log(bst); // shows BST{root:null}
答案 0 :(得分:0)
其中一个问题出在function addNode()
if(node==null){node=new Node(item);}
node
作为参数传递,这意味着调用this.addNode(tree.root, item);
时
node.a = 5
将tree.root.a
的值更改为5
node = 5
只是将此node
参数的值更改为5
,但不会将tree.root
值的实际参数分配给5
。< / LI>
醇>
答案 1 :(得分:0)
首先,您没有将任何内容指定为树的根目录。你的意图是this.root
。接下来,您的逻辑是您递归方法而不是递归树。
在为每个值调用addNode()
方法时,您始终会测试树的根,以获得>
和<
值。因此,此代码只会覆盖单个.left
或.right
值。因此,在内部递归函数并不能达到预期效果。
解决方案是递归树,寻找传递给函数的值的正确槽。
我已经重新编写了一些代码,并对API采取了一些自由。例如,创建一个新的BST将需要将起始值传递给构造函数(这只是有助于简化代码)。接下来,您将注意到不再有递归函数。递归调用被替换为while循环,该循环找到添加新节点的适当节点。
此代码实际上构建了树,因为您的尝试只构建单个级别。
编辑重构为搜索功能
class Node {
constructor(value) {
this.value = value;
this.left = {};
this.right = {};
}
show() {
console.log(this.value);
}
}
class BST {
constructor(value = 0) {
this.root = new Node(value);
}
addNode(item) {
Object.assign(this.search(item), new Node(item));
}
findLeftChild(item) {
return this.search(item).left.value;
}
search(item) {
let found = false;
let foundNode = this.root;
while (!found) {
if (foundNode.value === item) {
break;
} else if (foundNode.value > item) {
foundNode = foundNode.left;
found = foundNode.value === undefined;
} else if (foundNode.value < item) {
foundNode = foundNode.right;
found = foundNode.value === undefined;
}
}
return foundNode;
}
addItem(item) {
this.addNode(item);
}
}
let bst = new BST(5);
bst.addItem(43);
bst.addItem(12);
bst.addItem(6);
bst.addItem(66);
bst.addItem(22);
bst.addItem(4);
bst.addItem(3);
bst.addItem(2);
bst.addItem(1);
console.log("Found: 17 ", bst.search(17).value !== undefined);
console.log("find value less than 12: " + bst.findLeftChild(12));
console.log(JSON.stringify(bst, null, 2)); // shows BST{root:null}
&#13;