JavaScript中合并二叉树实现Kruskal算法遇tree is null错误如何解决
问题修复说明
你提供的代码存在4个核心错误,直接导致合并失效、运行报错:
- 空值访问顺序错误:在访问
tree.value、tree2.value前未做非空判断,遍历到空节点时直接访问属性就会抛出Uncaught TypeError: tree is null错误。 - 函数参数值传递问题:JS的普通类型、引用类型的参数都是值传递,你在递归中直接给形参
tree赋值tree = tree2.root,仅会修改当前函数作用域内的形参值,无法修改原二叉树父节点的left/right引用,导致插入操作完全不生效。 - this指向错误:
merge是全局定义的普通函数,内部调用this.merge时this默认指向window对象,window上没有merge方法,会直接触发未定义错误。 - 合并逻辑缺失:当前逻辑仅尝试插入第二棵树的根节点,完全没有处理第二棵树的左右子节点,就算根节点插入成功,子节点也会全部丢失。
修复方案
最简单的实现方式是复用你已经写好的add方法,遍历第二棵树的所有节点,依次插入第一棵树中,无需改动原有二叉树类的逻辑,仅修改合并函数即可:
function binarytree() { this.root = null; this.add = function(value) { var node = { value : value, left : null, right : null }; var current; if (this.root == null) this.root = node; else { current = this.root; while (1) { if (value < current.value) { if (current.left == null) { current.left = node; break; } else current = current.left; } else if (value > current.value) { if (current.right == null) { current.right = node; break; } else current = current.right; } else break; } } } this.search = function(value) { var found = false, current = this.root; while (!found && current) { if (value < current.value) current = current.left; else if (value > current.value) current = current.right; else found = true; } return found; } this.print = function(no) { if (no) { this.print(no.left); this.print(no.right); console.log(no.value); } } } var tree = new binarytree(); var tree2 = new binarytree(); // 修复后的合并函数:将sourceTree的所有节点合并到targetTree中 function merge(targetTree, sourceTree) { // 遍历源树所有节点 function traverse(node) { if (!node) return // 复用已有add方法插入节点 targetTree.add(node.value) traverse(node.left) traverse(node.right) } traverse(sourceTree.root) } tree.add(1); tree.add(2); tree.add(3); console.log("First tree:"); tree.print(tree.root); // 输出 1 3 2 tree2.add(7); tree2.add(8); tree2.add(9); console.log("Second tree:"); tree2.print(tree2.root); // 输出7 9 8 merge(tree, tree2); console.log("Merged trees:"); tree.print(tree.root); // 输出1 3 9 8 7 2
运行后即可看到合并后的树包含两棵树的所有节点,无报错。
内容的提问来源于stack exchange,提问作者visionary
相关产品推荐
相关产品推荐

