Javascript二进制搜索树方法不起作用

时间:2018-04-22 15:24:12

标签: javascript binary-tree

我正在尝试构建这个简单的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}

2 个答案:

答案 0 :(得分:0)

其中一个问题出在function addNode() if(node==null){node=new Node(item);}

node作为参数传递,这意味着调用this.addNode(tree.root, item);

  1. node.a = 5tree.root.a的值更改为5
  2. node = 5只是将此node参数的值更改为5,但不会将tree.root值的实际参数分配给5。< / LI>

    More info

答案 1 :(得分:0)

首先,您没有将任何内容指定为树的根目录。你的意图是this.root。接下来,您的逻辑是您递归方法而不是递归树。

在为每个值调用addNode()方法时,您始终会测试树的根,以获得><值。因此,此代码只会覆盖单个.left.right值。因此,在内部递归函数并不能达到预期效果。

解决方案是递归树,寻找传递给函数的值的正确槽。

我已经重新编写了一些代码,并对API采取了一些自由。例如,创建一个新的BST将需要将起始值传递给构造函数(这只是有助于简化代码)。接下来,您将注意到不再有递归函数。递归调用被替换为while循环,该循环找到添加新节点的适当节点。

此代码实际上构建了树,因为您的尝试只构建单个级别。

编辑重构为搜索功能

&#13;
&#13;
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;
&#13;
&#13;