Topic requirements:
1 . For the directed graph shown in the figure below ( the access order is from small to large ) , try to write:
(1) The depth-first spanning tree obtained from the depth-first search from vertex ① ;
(2) The breadth-first spanning tree obtained from the breadth-first search from vertex ② .
package com.test.tree; import java.util. *; public class Graph { // store node information private Object[] vertices; // store edge information private int[][] arcs; private int vexnum; // Record whether the i-th node has been visited private boolean[] visited; /** * @param args */ public static void main(String[] args) { Graph g = new Graph(5); Character[] vertices = { '1', '2', '3', '4', '5'}; g.addVertex(vertices); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(1, 3); g.addEdge(1, 4); g.addEdge(2, 3); g.addEdge(3, 4); g.addEdge(4, 0); System.out.println("Depth-first traversal: "); g.depthTraverse(); System.out.println(); System.out.println("Breadth-first traversal: "); g.broadTraverse2(1); System.out.println(); } public Graph(int n) { vexnum = n; vertices = new Object[n]; arcs = new int[n][n]; visited = new boolean[n]; for (int i = 0; i < vexnum; i++) { for (int j = 0; j < vexnum; j++) { arcs[i][j] = 0; } } } public void addVertex(Object[] obj) { this.vertices = obj; } public void addEdge(int i, int j) { if (i == j)return; arcs[i][j] = 1; //A single line represents a directed graph //arcs[j][i] = 1; // This one is a wireless map } public int firstAdjVex(int i) { for (int j = 0; j < vexnum; j++) { if (arcs[i][j] > 0) return j; } return -1; } public int nextAdjVex(int i, int k) { for (int j = k + 1; j < vexnum; j++) { if (arcs[i][j] > 0) return j; } return -1; } // depth-first traversal public void depthTraverse() { for (int i = 0; i < vexnum; i++) { visited[i] = false; } for (int i = 0; i < vexnum; i++) { if (!visited[i]) traverse(i); } } // deep recursive traversal of a connected graph public void traverse(int i) { // TODO Auto-generated method stub visited[i] = true; visit(i); for (int j = this.firstAdjVex(i); j >= 0; j = this.nextAdjVex(i, j)) { if (!visited[j]) this.traverse(j); } } // Breadth-first traversal of any node starts, here is the start of the second node public void broadTraverse2(int n) { // LinkedList implements the Queue interface Queue<Integer> q = new LinkedList<Integer>(); for (int i = 0; i < vexnum; i++) { visited[i] = false; } if (!visited[n]) { q.add(n); visited[n] = true; visit(n); while (!q.isEmpty()) { int j = (Integer) q.remove().intValue(); int k = this.firstAdjVex(j); for ( k = this.firstAdjVex(j); k >= 0; k = this .nextAdjVex(j, k)) { if (!visited[k]) { q.add(k); visited[k] = true; visit(k); } } } } } // Breadth-first traversal starts at 0 by default public void broadTraverse(int n) { // LinkedList implements the Queue interface Queue<Integer> q = new LinkedList<Integer>(); for (int i = 0; i < vexnum; i++) { visited[i] = false; } for (int i = 0; i < vexnum; i++) { if (!visited[i]) { q.add(i); visited[i] = true; visit(i); while (!q.isEmpty()) { int j = (Integer) q.remove().intValue(); for (int k = this.firstAdjVex(j); k >= 0; k = this .nextAdjVex(j, k)) { if (!visited[k]) { q.add(k); visited[k] = true; visit(k); } } } } } } private void visit(int i) { // TODO Auto-generated method stub System.out.print(vertices[i] + " "); } // the last one public int lastAdjVex (int i) { for (int j = vexnum - 1; j >= 0; j--) { if (arcs[i][j] > 0) return j; } return -1; } // Previous public int lastAdjVex (int i, int k) { for (int j = k - 1; j >= 0; j--) { if (arcs[i][j] > 0) return j; } return -1; } }