You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中合并二叉树实现Kruskal算法遇tree is null错误如何解决

问题修复说明

你提供的代码存在4个核心错误,直接导致合并失效、运行报错:

  1. 空值访问顺序错误:在访问tree.value、tree2.value前未做非空判断,遍历到空节点时直接访问属性就会抛出Uncaught TypeError: tree is null错误。
  2. 函数参数值传递问题:JS的普通类型、引用类型的参数都是值传递,你在递归中直接给形参tree赋值tree = tree2.root,仅会修改当前函数作用域内的形参值,无法修改原二叉树父节点的left/right引用,导致插入操作完全不生效。
  3. this指向错误:merge是全局定义的普通函数,内部调用this.merge时this默认指向window对象,window上没有merge方法,会直接触发未定义错误。
  4. 合并逻辑缺失:当前逻辑仅尝试插入第二棵树的根节点,完全没有处理第二棵树的左右子节点,就算根节点插入成功,子节点也会全部丢失。

修复方案

最简单的实现方式是复用你已经写好的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:09:03