簡體   English   中英

Javascript二進制搜索樹方法不起作用

[英]Javascript Binary Search Tree methods not working

我正在嘗試構建此簡單的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}

問題之一是在if(node==null){node=new Node(item);}處的function addNode()

node作為參數傳遞,這意味着this.addNode(tree.root, item); 叫做

  1. node.a = 5tree.root.a值更改為5
  2. node = 5只是將此node參數的值更改為5而不是實際參數tree.root值未分配給5

更多信息

首先,您沒有為樹的根分配任何東西。 您的意圖與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} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM