数据结构(Java语言描述): 编写程序,演示无向图的遍历操作。要求以邻接矩阵为存储结构实现连通无向图的深度优先遍历和广度优先遍历,输出图的邻接矩阵,并以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。
时间: 2024-12-24 08:33:33 浏览: 3
在Java中,数据结构是程序设计的重要基础,特别是在处理无向图这样的复杂数据结构时。邻接矩阵是一种常见的表示无向图的方式,它是一个二维数组,其中每个元素(i, j)代表原点i到目标j是否存在一条边。
首先,我们需要定义一个Node类来表示图中的节点,包含节点值和邻居列表。然后,我们可以创建一个AdjacencyMatrixGraph类,内部维护一个二维数组来存储邻接矩阵。以下是深度优先遍历(DFS)和广度优先遍历(BFS)的基本实现:
```java
class Node {
int value;
List<Node> neighbors;
// constructor, getters and setters...
}
class AdjacencyMatrixGraph {
private int[][] adjacencyMatrix;
public AdjacencyMatrixGraph(int[][] matrix) {
this.adjacencyMatrix = matrix;
}
// Methods for DFS and BFS:
void dfs(int start, List<Integer> visited, List<List<Integer>> edges) {
visited.add(start);
for (int neighbor : adjacencyMatrix[start]) {
if (!visited.contains(neighbor)) {
dfs(neighbor, visited, edges);
}
}
edges.add(new ArrayList<>(visited)); // Add the visited nodes as a sublist
}
void bfs(int start, List<Integer> visited, List<List<Integer>> edges) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(start);
visited.add(start);
while (!queue.isEmpty()) {
int node = queue.poll();
for (int neighbor : adjacencyMatrix[node]) {
if (!visited.contains(neighbor)) {
queue.offer(neighbor);
visited.add(neighbor);
}
}
}
edges.add(new ArrayList<>(visited));
}
// Output methods:
void printAdjMatrix() { /*...*/ } // Print the adjacency matrix
void printDFS(int start) {
List<Integer> sequence = new ArrayList<>();
dfs(start, sequence, null); // Call DFS and get the sequence
System.out.println("DFS sequence: " + sequence);
printEdges(sequence); // Print generated tree's edge set
}
void printBFS(int start) {
// Similar to printDFS but with bfs method
}
private void printEdges(List<Integer> sequence) {
// Extract the edges from the sequence based on graph structure
// Example: edges.add(node1 -> node2, node2 -> node3, ...)
}
}
```
在这个示例中,`printDFS()` 和 `printBFS()` 方法接受起始节点作为参数,分别运行相应的遍历算法,并输出访问序列以及生成树的边集。你可以通过实例化AdjacencyMatrixGraph并调用这些方法来进行实际的操作。记得添加必要的辅助方法来打印邻接矩阵和其他细节。
阅读全文