Skip to content

Commit 4566f5d

Browse files
committed
[Function add]
1.Add conclusion of pre-traversal, post traversal and reverse post traversal.
1 parent aed3cd4 commit 4566f5d

File tree

3 files changed

+119
-1
lines changed

3 files changed

+119
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package ca.mcmaster.chapter.four.graph.directed;
2+
3+
import java.util.Queue;
4+
import java.util.Stack;
5+
import java.util.concurrent.LinkedBlockingQueue;
6+
7+
public class DepthFirstOrder {
8+
private final boolean[] marked;
9+
private final Queue<Integer> pre;
10+
private final Queue<Integer> post;
11+
private final Stack<Integer> reversePost;
12+
public DepthFirstOrder(Digraph g){
13+
pre = new LinkedBlockingQueue<Integer>();
14+
post = new LinkedBlockingQueue<>();
15+
reversePost = new Stack<>();
16+
marked = new boolean[g.V()];
17+
for(int v = 0; v < g.V(); v++)
18+
if(!marked[v]) dfs(g, v);
19+
}
20+
21+
private void dfs(Digraph g, int v){
22+
pre.offer(v);
23+
marked[v] = true;
24+
for(int w : g.adj(v))
25+
if(!marked[w]) dfs(g, w);
26+
post.offer(v);
27+
reversePost.push(v);
28+
}
29+
public Iterable<Integer> pre(){
30+
return this.pre;
31+
}
32+
public Iterable<Integer> post(){
33+
return this.post();
34+
}
35+
public Iterable<Integer> reversePost(){
36+
return this.reversePost;
37+
}
38+
}
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package ca.mcmaster.chapter.four.graph.directed;
2+
3+
import java.util.Queue;
4+
import java.util.Stack;
5+
import java.util.concurrent.LinkedBlockingQueue;
6+
7+
public class DepthFirstOrder {
8+
private final boolean[] marked;
9+
private final Queue<Integer> pre;
10+
private final Queue<Integer> post;
11+
private final Stack<Integer> reversePost;
12+
public DepthFirstOrder(Digraph g){
13+
pre = new LinkedBlockingQueue<Integer>();
14+
post = new LinkedBlockingQueue<>();
15+
reversePost = new Stack<>();
16+
marked = new boolean[g.V()];
17+
for(int v = 0; v < g.V(); v++)
18+
if(!marked[v]) dfs(g, v);
19+
}
20+
21+
private void dfs(Digraph g, int v){
22+
pre.offer(v);
23+
marked[v] = true;
24+
for(int w : g.adj(v))
25+
if(!marked[w]) dfs(g, w);
26+
post.offer(v);
27+
reversePost.push(v);
28+
}
29+
public Iterable<Integer> pre(){
30+
return this.pre;
31+
}
32+
public Iterable<Integer> post(){
33+
return this.post();
34+
}
35+
public Iterable<Integer> reversePost(){
36+
return this.reversePost;
37+
}
38+
}

DataStructrue/Graph/DirectedGraph.md

+43-1
Original file line numberDiff line numberDiff line change
@@ -345,4 +345,46 @@ public class DirectedCycle {
345345
System.out.println(sb.toString());
346346
}
347347
```
348-
> 3 4 5 3
348+
> 3 4 5 3
349+
350+
### 有向图的遍历
351+
* 有向图的遍历分成三种。
352+
1. 前序遍历
353+
>前序遍历就是dfs()的调用顺序,将顶点加入队列。
354+
2. 后序遍历
355+
>后序遍历,就是递归调用之后将顶点加入队列中。
356+
3. 逆后序遍历
357+
>逆后序遍历和后序遍历相似,但是是将顶点加入栈中。
358+
```Java
359+
public class DepthFirstOrder {
360+
private final boolean[] marked;
361+
private final Queue<Integer> pre; //前序遍历。和dfs的顺序一致,当访问到了一个顶点,就将顶点加入队列。
362+
private final Queue<Integer> post; //后序遍历,顶点遍历完成的顺序。从递归的最内部开始加入遍历,相当于完成后立刻加入队列之中。
363+
private final Stack<Integer> reversePost;
364+
public DepthFirstOrder(Digraph g){
365+
pre = new LinkedBlockingQueue<Integer>();
366+
post = new LinkedBlockingQueue<>();
367+
reversePost = new Stack<>();
368+
marked = new boolean[g.V()];
369+
for(int v = 0; v < g.V(); v++)
370+
if(!marked[v]) dfs(g, v);
371+
}
372+
private void dfs(Digraph g, int v){
373+
pre.offer(v); //前序:一访问到某个顶点就立刻加入队列。
374+
marked[v] = true;
375+
for(int w : g.adj(v))
376+
if(!marked[w]) dfs(g, w);
377+
post.offer(v); //后序:完成后,将顶点加入队列。从递归的最内部加入队列。
378+
reversePost.push(v); //逆后序:加入栈
379+
}
380+
public Iterable<Integer> pre(){
381+
return this.pre;
382+
}
383+
public Iterable<Integer> post(){
384+
return this.post();
385+
}
386+
public Iterable<Integer> reversePost(){
387+
return this.reversePost;
388+
}
389+
}
390+
```

0 commit comments

Comments
 (0)