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

实现Graph类时BFS方法出现「无法读取undefined的length属性」错误的技术求助

解决图BFS中的「无法读取undefined属性」错误

我一眼就揪出了问题的核心——你的BFS方法里入队了错误的元素,导致后续处理时拿到的不是Node实例,自然找不到对应的属性。

错误原因拆解

  1. 第一个错误「无法读取undefined的length属性」:
    你在遍历节点u的邻接边时,执行了lista.enqueue(u.ar[i]);——这里u.ar[i]是你定义的边对象(包含finalnode和peso),而不是Node实例。当后续循环从队列里取出这个边对象时,它没有ar属性,所以u.ar是undefined,读取length就会抛出错误。

  2. 第二个错误「无法读取undefined的finalnode属性」:
    当你把u.ar.length换成固定数字后,此时u已经是之前入队的边对象,它本身没有ar属性,所以u.ar[i]是undefined,访问finalnode自然会报错。

另外,你的BFS还缺少未访问节点的判断,如果不检查节点颜色直接入队,会导致重复入队同一个节点,引发逻辑错误甚至死循环。

修复后的BFS代码

BFS(s) {
  var i;
  var u;
  var lista = new Queue();
  // 初始化所有节点状态
  for (i = 0; i < this.arr.length; i++) {
    this.arr[i].color = "white";
    this.arr[i].d = Infinity;
    this.arr[i].parent = null;
  }
  s.color = "grey";
  s.d = 0;
  lista.enqueue(s);
  
  while (lista.head != null) {
    u = lista.dequeue();
    // 遍历u的所有邻接边
    for (i = 0; i < u.ar.length; i++) {
      const neighbor = u.ar[i].finalnode; // 取出真正的邻接节点
      // 只处理未访问的白色节点,避免重复入队
      if (neighbor.color === "white") {
        neighbor.color = "grey";
        neighbor.parent = u;
        neighbor.d = u.d + 1;
        lista.enqueue(neighbor); // 入队邻接节点,而不是边对象
      }
    }
    u.color = "black";
  }
}

额外优化建议

你的Queue类的enqueue方法可以简化,不用分三次判断size,逻辑更清晰:

enqueue(s) {
  const i = new Item(s);
  if (this.size === 0) {
    this.head = i;
  } else {
    this.tail.next = i;
  }
  this.tail = i;
  this.size++;
}

这样修改后,你的BFS就能正常工作了,队列里始终是Node实例,不会再出现undefined属性的错误。

内容的提问来源于stack exchange,提问作者Antonio Ugolini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:52:32