@@ -21,6 +21,7 @@ public class Graph {
21
21
*
22
22
* @param count 数量
23
23
*/
24
+ @ SuppressWarnings ("unchecked" )
24
25
private Graph (int count ) {
25
26
this .count = count ;
26
27
adj = new LinkedList [count ];
@@ -35,7 +36,7 @@ private Graph(int count) {
35
36
* @param oSide order
36
37
* @param rSide reversed order
37
38
*/
38
- public void add (int oSide , int rSide ) {
39
+ private void add (int oSide , int rSide ) {
39
40
adj [oSide ].add (rSide );
40
41
adj [rSide ].add (oSide );
41
42
}
@@ -63,18 +64,90 @@ private void bfs(int oSide, int rSide) {
63
64
int value = adj [index ].get (j );
64
65
if (!visited [value ]) {
65
66
prev [value ] = index ;
66
- if (index == rSide ) {
67
+ if (value == rSide ) {
67
68
print (prev , oSide , rSide );
68
69
}
70
+ visited [value ] = true ;
71
+ queue .offer (value );
69
72
}
70
73
}
71
74
}
72
75
}
73
76
74
- private void dfs (){
77
+ private boolean found = false ;
78
+ /**
79
+ * 深度优先搜索
80
+ *
81
+ * @param oSide 顺序边
82
+ * @param rSide 逆序边
83
+ */
84
+ private void dfs (int oSide , int rSide ) {
85
+ boolean [] visited = new boolean [count ];
86
+ int [] prev = new int [count ];
87
+ for (int i = 0 ; i < count ; i ++) {
88
+ prev [i ] = -1 ;
89
+ }
90
+ recursiveDfs (visited , prev , oSide , rSide );
91
+ print (prev , oSide , rSide );
92
+ }
93
+
94
+ /**
95
+ * 递归
96
+ *
97
+ * @param visited visited
98
+ * @param prev prev
99
+ * @param oSide 顺序边
100
+ * @param rSide 逆序边
101
+ */
102
+ private void recursiveDfs (boolean [] visited , int [] prev , int oSide , int rSide ) {
103
+ if (found ) return ;
104
+ visited [oSide ] = true ;
105
+ if (oSide == rSide ) {
106
+ found = true ;
107
+ return ;
108
+ }
109
+ for (int i = 0 ; i < adj [oSide ].size (); i ++) {
110
+ int value = adj [oSide ].get (i );
111
+ if (!visited [value ]) {
112
+ prev [value ] = oSide ;
113
+ recursiveDfs (visited , prev , value , rSide );
114
+ }
115
+ }
116
+ }
117
+
118
+ private void createGraph () {
119
+ // 0 -- 1 -- 2
120
+ // | | |
121
+ // 3 -- 4 -- 5
122
+ // | | |
123
+ // 6 -- 7 -- 8
124
+ add (0 ,1 );//add(1,0);
125
+ add (0 ,3 );//add(3,0);
126
+
127
+ add (1 ,2 );//add(2,1);
128
+ add (1 ,4 );// add(4,1);
129
+
130
+ add (2 ,5 );//add(5,2);
131
+
132
+ add (3 ,4 );//add(4,3);
133
+ add (3 ,6 );//add(6,3);
75
134
135
+ add (4 ,5 );//add(5,4);
136
+ add (4 ,7 );// add(7,4);
137
+
138
+ add (5 ,8 );//add(8,5);
139
+
140
+ add (6 ,7 );//add(7,6);
141
+
142
+ add (7 ,8 );//add(8,7);
76
143
}
77
144
145
+ /**
146
+ * 递归正向输出图的路径
147
+ * @param prev prev
148
+ * @param oSide 顺序边
149
+ * @param rSide 逆序边
150
+ */
78
151
private void print (int [] prev , int oSide , int rSide ) {
79
152
if (prev [rSide ] != -1 && oSide != rSide ) {
80
153
print (prev , oSide , prev [rSide ]);
@@ -83,6 +156,18 @@ private void print(int[] prev, int oSide, int rSide) {
83
156
}
84
157
85
158
public static void main (String [] args ) {
86
-
159
+ int count = 9 ;
160
+ Graph graph = new Graph (count );
161
+ // 0 -- 1 -- 2
162
+ // | | |
163
+ // 3 -- 4 -- 5
164
+ // | | |
165
+ // 6 -- 7 -- 8
166
+ graph .createGraph ();
167
+ System .out .println ("BFS(广度优先搜索)" );
168
+ graph .bfs (0 ,8 );
169
+ System .out .println ();
170
+ System .out .println ("DFS(深度优先搜索)" );
171
+ graph .dfs (0 ,8 );
87
172
}
88
173
}
0 commit comments