实现Graph类时BFS方法出现「无法读取undefined的length属性」错误的技术求助
解决图BFS中的「无法读取undefined属性」错误
我一眼就揪出了问题的核心——你的BFS方法里入队了错误的元素,导致后续处理时拿到的不是Node实例,自然找不到对应的属性。
错误原因拆解
第一个错误「无法读取undefined的length属性」:
你在遍历节点u的邻接边时,执行了lista.enqueue(u.ar[i]);——这里u.ar[i]是你定义的边对象(包含finalnode和peso),而不是Node实例。当后续循环从队列里取出这个边对象时,它没有ar属性,所以u.ar是undefined,读取length就会抛出错误。第二个错误「无法读取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
相关产品推荐
相关产品推荐

