二叉树添加未定义的节点

时间:2019-02-19 14:27:34

标签: javascript data-structures tree

问题

我正在尝试更好地研究树理论,我可以添加一个或多个节点而不会出现问题,但是我注意到,如果我尝试在不传递参数的情况下启动多个add函数,则根本不起作用。你能解释我的错误在哪里吗?

代码

BinarySearchTree.prototype.makeNode = function(value) {
    var node = {};
    node.value = value;
    node.left = null;
    node.right = null;
    return node;
};

BinarySearchTree.prototype.add = function(value) {
    var currentNode = this.makeNode(value);
    if (!this.root) {
        this.root = currentNode;
    } else {
        this.insert(currentNode);
    }

    return this;
};

BinarySearchTree.prototype.insert = function(currentNode) {
    var value = currentNode.value;
    var traverse = function(node) {
        if (value > node.value) {
            if (!node.right) {
                node.right = currentNode;
                return;
            } else traverse(node.right);
        } else if (value < node.value) {
            if (!node.left) {
                node.left = currentNode;
                return;
            } else traverse(node.left);
        }
    };
    traverse(this.root);
};

现在,如果我尝试

var bst = new BinarySearchTree();
bst.add(3).add(2);
console.log(bst);

我将拥有这个console.log enter image description here

如果我尝试传递未定义的值

var bst = new BinarySearchTree();
    bst.add().add(2);
    console.log(bst);

console.log

期望

我希望最后一个console.log不会丢失2的值。

。我阅读了这篇文章,以更好地了解如果我没有将任何值传递给函数

What happens if I don't pass a parameter in a Javascript function? 和其他与树理论相关的文章(例如中级和堆栈溢出)和指南,但我没有找到任何解决办法

解决方案

由于@Nina Scholz的建议和更正,我刚刚将此行添加到了此功能

BinarySearchTree.prototype.add = function(value) {
    if (typeof value == 'undefined') {
        value = null;
    }
    var currentNode = this.makeNode(value);
    if (!this.root) {
        this.root = currentNode;
        console.log('sei qui')
    } else {
        this.insert(currentNode);
    }

    return this;
};

1 个答案:

答案 0 :(得分:2)

什么也没有发生,因为两个条件都将undefined的值评估为value为假。

if (value > node.value) {
    // ...
} else if (value < node.value) {
    // ...
}

function BinarySearchTree() {}

BinarySearchTree.prototype.makeNode = function(value) {
    var node = {};
    node.value = value;
    node.left = null;
    node.right = null;
    return node;
};

BinarySearchTree.prototype.add = function(value) {
    var currentNode = this.makeNode(value);
    if (!this.root) {
        this.root = currentNode;
    } else {
        this.insert(currentNode);
    }

    return this;
};

BinarySearchTree.prototype.insert = function(currentNode) {
    var value = currentNode.value;
    var traverse = function(node) {
        if (value > node.value) {
            if (!node.right) {
                node.right = currentNode;
                return;
            } else traverse(node.right);
        } else if (value < node.value) {
            if (!node.left) {
                node.left = currentNode;
                return;
            } else traverse(node.left);
        }
    };
    traverse(this.root);
};

var bst = new BinarySearchTree();
bst.add(3).add(2).add();
console.log(bst);