感谢大牛关于图类的创建:https://www.cnblogs.com/hapjin/p/4760934.html.
思路大概是:
1.创建顶点类,每个顶点有自身标识(或value)
2.该顶点类中包含Edge类,以每个顶点对象为首,创建邻接表,表中元素为Edge对象,Edge类中包含终点节点以及边的权重;
3.顶点类中包含了对于顶点的操作,有添加边,遍历节点,该节点是否被访问,寻找未被访问的邻接点;当前节点的前继等操作;
4.遍历过程中使用了迭代器Iterator,其中创建Iterator<VertexInterface>类,该类中有可以访问Edge的Iterator,类中重新定义hasNext();next();函数;通过创建Iterator<VertexInterface>对象,便可得到遍历邻接表的迭代器;
5.通过迭代器查找边,插入边,寻找访问的邻接边等功能;
6.创建图类,定点类的对象在图类中用map<>容器存储;map使用hash表进行数据的存储;
7.图类中有返回顶点个数,边数,插入边,查找边,清空,初始化等功能;
通过创建图的接口,并用图类数据结构实现图的深度优先遍历(DFT)和广度优先遍历(BFT)
代码段如下:
//深度优先遍历近似为树的前序遍历;
/*
* 通过队列,堆栈辅助实现DFT(non-Javadoc)
* 将初始节点压入堆栈,标记为已访问,同时入队
* 访问栈顶节点,寻找栈顶节点相邻未访问节点,入栈,此时将站顶节点设为已访问,同时入队;
* 重复上一步,直至栈空;
* 返回队列,依次出队,即为深度优先遍历顺序;
* @see GraphInterface#getDepthFirstTraversal(java.lang.Object)
*/
public Queue<T> getDepthFirstTraversal(T origin) {
// TODO Auto-generated method stub
resetVertices();
LinkedList<VertexInterface<T>> vertexStack=new LinkedList<>();//辅助DFS递归遍历
Queue<T> traversalOrder=new LinkedList<>();//保存DFS遍历顺序
VertexInterface<T> originVertex=vertices.get(origin);
originVertex.Visite();//访问起始顶点
vertexStack.push(originVertex);//顶点入栈顺序为DFS遍历顺序
traversalOrder.offer(originVertex.getValue());//当顶点入栈时,保存在队列中
while(!vertexStack.isEmpty())
{
VertexInterface<T> topVertex=vertexStack.peek();
//找到栈顶节点未被访问的邻接点,从该邻接点接着去遍历邻接点
VertexInterface<T> nextNeighbor=topVertex.getUnvisiteNeighbor();
if(nextNeighbor!=null)
{
nextNeighbor.Visite();
vertexStack.push(nextNeighbor);
traversalOrder.offer(nextNeighbor.getValue());//每访问一个节点,将其入队列
}
else
{
vertexStack.pop();
}
}
return traversalOrder;//队列出列顺序即为深度遍历顺序;
}
//广度优先遍历为树的层序遍历
/*
* 使用两个辅助队列(non-Javadoc)
* 初始节点入队A,设定为已访问,初始节点入队B;
* 队A节点出队,设定迭代器,遍历访问该节点未访问邻接节点;依次入队A;队B;入队节点均设为已访问;
* 重复上一步,直至队A空;
* 返回队B,队中序列即为层序遍历:
* @see GraphInterface#getBreadFirstTraversal(java.lang.Object)
*/
@Override
public Queue<T> getBreadFirstTraversal(T origin) {
// TODO Auto-generated method stub
resetVertices();
LinkedList<VertexInterface<T>> vertexQueue=new LinkedList<>();//辅助队列
LinkedList<T> valueQueue=new LinkedList<>();//BFT遍历顺序
VertexInterface<T> OriginVertex=vertices.get(origin);
OriginVertex.Visite();
vertexQueue.offer(OriginVertex);
valueQueue.offer(OriginVertex.getValue());
while(!vertexQueue.isEmpty())
{
VertexInterface<T> frontVertex=vertexQueue.poll();
Iterator<VertexInterface<T>> frontIterator=frontVertex.getNeighborVertex();
while(frontIterator.hasNext())
{
VertexInterface<T> nextVertex=frontIterator.next();
if(!nextVertex.Isvisited())//广度优先遍历优先访问未访问节点;
{
vertexQueue.offer(nextVertex);
nextVertex.Visite();
valueQueue.offer(nextVertex.getValue());
}
}
}
return valueQueue;
}