【问题标题】:Recursive Add method for BST using Javascript not working使用 Javascript 的 BST 的递归添加方法不起作用
【发布时间】:2021-01-31 09:32:54
【问题描述】:

下面是一个带有插入函数的 BST 的实现。目前,该代码不起作用;它只会吐出Tree { root: null }

当我尝试调试它时,它似乎成功地将新节点添加到了正确的位置,但是一旦它从函数返回,所有数据都丢失了,并且最终没有插入任何东西。

代码如下:

class Node {
    constructor(value) {
        this.value = value
        this.left = null;
        this.right = null;
    }
}

class Tree {
    constructor() {
        this.root = null
    }

    insert(value) {
        const insertHelper = (value, node) => {
            if (node === null) {
                node = new Node(value)
                return null
            } else if (node.value === node.value) {
                console.log("Value exists.")
                return null;
            } else if (node.value < node.value) {
                return this.insertHelper(node, node.right)
            } else {
                return this.insertHelper(node, node.left)
            }
        }

        return insertHelper(value, this.root)
    }

}

var tree = new Tree;
tree.insert(10)
tree.insert(5)

console.log(tree);

【问题讨论】:

    标签: javascript recursion binary-search-tree


    【解决方案1】:

    几个问题:

    • this.root 永远不会被修改。函数参数是按值传递的,因此如果您将this.root 作为参数传递,并且函数将新值分配给相应的参数变量node,这不会影响this.root。解决方案是让辅助函数 return 作为参数传递的节点的新值,以便您可以将其分配回根(或其他节点)。

    • 您在多个地方将node.valuenode.value 进行比较。这是一个错误。比较应该涉及value

    • 递归调用将node 作为第一个参数传递,而函数期望 作为第一个参数。

    以下是更正后的代码:

    class Node {
        constructor(value) {
            this.value = value;
            this.left = null;
            this.right = null;
        }
    }
    
    class Tree {
        constructor() {
            this.root = null;
        }
    
        insert(value) {
            const insertHelper = (value, node) => {
                if (node === null) {
                    node = new Node(value);
                } else if (node.value === value) {
                    console.log("Value exists.");
                } else if (node.value < value) {
                    node.right = insertHelper(value, node.right);
                } else {
                    node.left = insertHelper(value, node.left);
                }
                return node;
            }
            this.root = insertHelper(value, this.root);
        }
    }
    
    var tree = new Tree;
    tree.insert(10);
    tree.insert(5);
    console.log(tree);

    注意:明确使用分号。依靠automatic semi-colon insertion 要求trouble。总有一天它会打击你。

    【讨论】:

      猜你喜欢
      • 2015-11-08
      • 2018-03-25
      • 1970-01-01
      • 2020-11-18
      • 2022-11-12
      • 2017-07-29
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多