二叉树add方法不传参数致后续节点丢失问题排查与解决
二叉搜索树连续无参数调用
add后,后续节点丢失问题解析 问题根源
我帮你梳理下问题出在哪:当你调用不带参数的add()时,value参数会是undefined,你的代码会直接用这个undefined创建一个节点。如果这是第一次调用,这个value=undefined的节点就会成为树的根节点。
等你后续调用add(2)时,进入insert方法的遍历逻辑,会拿2和根节点的undefined做比较:
- 在JavaScript里,
2 > undefined的结果是false,2 < undefined的结果也是false - 这就导致你的遍历函数里两个分支条件都不满足,根本没执行插入操作,所以
2对应的节点看起来就“丢失”了。
修复方案
你已经想到了给add方法加参数判断,这个方向完全正确,我给你优化下写法,让逻辑更严谨:
BinarySearchTree.prototype.add = function(value) { // 未传入参数时直接返回,不创建无效节点 if (typeof value === 'undefined') { return this; } var currentNode = this.makeNode(value); if (!this.root) { this.root = currentNode; } else { this.insert(currentNode); } return this; };
这样修改后,bst.add().add(2)就等价于直接调用bst.add(2),不会创建无效的undefined节点,后续插入自然正常。
如果你习惯ES6+的写法,也可以用更简洁的方式处理:
BinarySearchTree.prototype.add = function(value) { // 未传参时直接跳过节点创建逻辑 if (value === undefined) return this; var currentNode = this.makeNode(value); if (!this.root) { this.root = currentNode; } else { this.insert(currentNode); } return this; };
额外说明
为什么比较会失效?这是JavaScript的类型比较规则决定的:undefined和任何值进行大于/小于比较时,结果都是false,所以当根节点是undefined值时,所有后续节点的插入都会因为找不到合适的分支而失败。
内容的提问来源于stack exchange,提问作者Legeo
相关产品推荐
相关产品推荐

