package structure.graph.traverse;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Random;
import structure.graph.create.GraphCreater_01;
import structure.graph.node.GNode_01;
/**
* 深度优先遍历
*
* @author Toy
*
*/
public class DFS_01 {
/**
* g为图的邻接矩阵,list为顶点元素,isDirect表示是否为有向图
*
* @param g
* @param list
* @param isDirect
*/
public void dfs_01(int[][] g, ArrayList<GNode_01> list, boolean isDirect) {
int size = list.size();
LinkedList<GNode_01> stack = new LinkedList<GNode_01>();
HashSet<GNode_01> visited = new HashSet<GNode_01>();
int si = new Random().nextInt(size);
list.get(si).show();
visited.add(list.get(si));
stack.push(list.get(si));
while (!stack.isEmpty()) {
GNode_01 peek = stack.peek();
int idx=getNodeIndex(peek,list);
if(idx>=0){
boolean hasChild=false;
for(int i=0;i<size;i++){
if(g[idx][i]>0&&!visited.contains(list.get(i))){
list.get(i).show();
visited.add(list.get(i));
stack.push(list.get(i));
hasChild=true;
break;
}
}
if(!hasChild){
System.out.println("pop");
stack.pop();
}
}
}
}
/**
* 在list获取节点n的索引位置
* @param n
* @param list
* @return
*/
private int getNodeIndex(GNode_01 n, ArrayList<GNode_01> list) {
String label=n.getLabel();
for(int i=0;i<list.size();i++){
if(label.equals(list.get(i).getLabel())){
return i;
}
}
return -1;
}
/**
* @param args
*/
public static void main(String[] args) {
boolean isDirect=false;
GraphCreater_01 c=new GraphCreater_01();
int[][] g = c.createGraph(isDirect);
c.show(g, c.vertexList.size());
DFS_01 t=new DFS_01();
t.dfs_01(g, c.vertexList, isDirect);
}
}