感谢大牛关于图类的创建: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<>