如何使用Java的LeetCode Node类为图添加节点与叶子值 构建图用于BFS学习调试
基于给定Node类的Java邻接表图构建实操
先明确示例图的节点连接关系
你提到的参考图是LeetCode N叉结构题的通用示例,实际连通关系为:
- 根节点值为1,直接连通3、2、4三个节点
- 值为3的节点,直接连通5、6两个节点
- 2、4、5、6均为无下游连通节点的叶子节点
逐步骤构建图结构
1. 初始化所有独立节点实例
按照节点值逐个创建对象,绝对不要重复创建同一个值对应的节点实例,否则会出现结构断裂:
// 逐个创建唯一的节点实例 Node node1 = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3); Node node4 = new Node(4); Node node5 = new Node(5); Node node6 = new Node(6);
2. 初始化邻接列表并绑定连通关系
绝大多数人第一次构建时都会踩这个坑:你提供的Node类中,单参构造方法仅赋值了节点val,没有给children属性初始化列表容器,直接调用add()会直接触发空指针异常,必须先手动给每个节点的children分配ArrayList实例:
// 给每个节点的children属性初始化空列表 node1.children = new ArrayList<>(); node2.children = new ArrayList<>(); node3.children = new ArrayList<>(); node4.children = new ArrayList<>(); node5.children = new ArrayList<>(); node6.children = new ArrayList<>(); // 逐节点绑定实际连通关系 // 值为1的根节点,邻接3、2、4 node1.children.add(node3); node1.children.add(node2); node1.children.add(node4); // 值为3的节点,邻接5、6 node3.children.add(node5); node3.children.add(node6); // 叶子节点2、4、5、6没有下游邻接节点,保持空列表即可
用BFS遍历验证构建结果
图构建完成后,直接运行BFS遍历逻辑校验结构是否正确,刚好可以同步练习BFS的标准写法:
public static void bfsValidate(Node root) { if (root == null) return; Queue<Node> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int currentLevelSize = queue.size(); // 按层打印节点值,对比预期输出即可判断结构是否正确 for (int i = 0; i < currentLevelSize; i++) { Node currNode = queue.poll(); System.out.print(currNode.val + " "); // 非空判断后把当前节点的所有邻接节点入队 if (currNode.children != null) { queue.addAll(currNode.children); } } System.out.println(); } } // 调用方法验证,预期输出为: // 1 // 3 2 4 // 5 6 bfsValidate(node1);
构建时的其他常见踩坑点
- 绑定邻接关系时不要直接new节点:比如写
node1.children.add(new Node(3)),后续单独操作的node3和这个绑定在node1里的节点是两个独立实例,会导致整个图结构断裂 - BFS遍历一定要加children的非空判断,兼容构造过程中可能出现的列表为null的情况
内容的提问来源于stack exchange,提问作者RajB009
相关产品推荐
相关产品推荐

